プログラミング学習の記録 #013(C)
年末は、おせち製造のアルバイトに従事するため、あまり学習のための時間が取れない。卒業研究の進捗も大事だが、今年が最後の参加となるおせち製造のアルバイトも大事である。アルバイトが休みの日に、着実に学習を進めていかねばならない。
前回の復習
練習問題 9.3
円の面積を台形法を利用して求めよ。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define max 10000 //Input calculation accuracy.
#define radius 2
#define function_name sqrt( pow(radius,2) - pow(x,2) ) //Input function of x.
#define start_x 0 //Input start point of x range.
#define end_x radius //Input end point of x range.
double function(double x)
{
double f ;
f = function_name ;
return f ;
}
double integral(double a, double b)
{
double dx, sum ;
double x ;
dx = ( b - a ) / max ;
sum = 0 ;
x = a ;
while(x + dx <= b )
{
sum = sum + ( function(x) + function(x + dx) ) / 2 * dx ;
x = x + dx ;
}
return sum ;
}
int main()
{
double a, b, i ;
a = start_x ;
b = end_x ;
if(a > b)
{
printf("Error in range.\n");
exit(1);
}
i = integral(a,b) ;
i = 4 * i ;
printf("Area of circle is %f \n", i);
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
前回書いた積分計算のコードを少しだけ書き換えて、円の面積を求めるコードを書いた。このコードでは、半径$${2}$$の円の面積を求めている。
練習問題 9.4
常微分方程式
$$
\dfrac{\text{d} y}{\text{d} x}
= f(x,y) ,~~
y(0)
= y_{0}
$$
を数値計算で近似的に解く最も単純な方法としてEuler法と呼ばれる方法がある。
$$
y( x + \Delta x )
= y(x) + f(x,y(x)) \cdot \Delta x
$$
これを$${x=0}$$から開始して繰り返していく。ただし、$${\Delta x}$$は、微少量と見なせる小さい数である。Euler法を用いて、
$$
\begin{array}{ll}
f(x,y) = 1 - y ,~~ &y(0) = 0 \\
f(x,y) = y(1-y) ,~~ &y(0) = 0.01
\end{array}
$$
などの場合について、微分方程式を数値的に解いてみよ。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define function_name (1-y)
#define start_x 0
#define start_y 0
#define end_x 15
#define delta_x 0.005
double function(double x, double y)
{
double f ;
f = function_name ;
return f ;
}
int main()
{
double x,y ;
int i;
x = start_x ;
y = start_y ;
i = 0 ;
printf("x y\n");
while( x < end_x )
{
y = y + function(x,y) * delta_x ;
x = x + delta_x ;
if(i % 100 == 0)
{
printf("%12.4f %12.4f\n",x,y);
}
i = i + 1 ;
}
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
$${f(x,y) = 1-y}$$の場合について解いてみた。この計算結果をExcelで簡単にプロットしたところ、下図のようになった。
手計算で解いてみると、$${y= 1 - e^{-x}}$$となった。上図より、確かに$${y=1}$$に収束していることがわかる。また、$${f(x,y) = y(1-y)}$$の場合について解き、同様にExcelで簡単にプロットすると、下図のようになった。
なんとなく、$${f(x,y) = y(1-y)}$$という式から、$${y=0,1}$$に収束しそうな感じがするので、上図でよさそうな気がする。手計算では解いていないので、実際のところは誤っているかもしれない。
ポインタ
とりあえず、このサイトを参考にして、以下のようなコードを書いてみた。
#include <stdio.h>
int main()
{
char a[7];
char *ptr;
int i;
a[0] = 'a';
a[1] = 'b';
a[2] = 'c';
a[3] = 'd';
a[4] = 'e';
a[5] = 'f';
a[6] = '\0';
printf("%s\n", a);
ptr = a;
*ptr = 'M';
for(i = 0 ; i < 2 ; i = i + 1 )
{
ptr = ptr + 1 ;
*ptr = 'i';
}
ptr = ptr + 1 ;
*ptr = 'p';
ptr = ptr + 1 ;
*ptr = 'a';
ptr = ptr + 1 ;
*ptr = 'n';
printf("%s\n", a);
printf("HAPPY SMILE (^_^)v\n");
return 0;
}
それから、「苦しんで覚えるC言語」を参考にして、アドレスとポインタを学習した。要するに、コード内で複数の関数を用いる場合に、ポインタをうまく使うことで、ショートカットような役割を果たすということだと理解した。
-----
動け!タイムライン