見出し画像

プログラミング学習の記録 #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言語」を参考にして、アドレスとポインタを学習した。要するに、コード内で複数の関数を用いる場合に、ポインタをうまく使うことで、ショートカットような役割を果たすということだと理解した。

-----

動け!タイムライン

いいなと思ったら応援しよう!

flowes_oyr
動物園か水族館にいきたいですね。

この記事が参加している募集