1 非線型方程式の解を求めるプログラム

1.1 2分法


#include <stdio.h> double func(double x); /*=============================================================*/ /* main function */ /*=============================================================*/ int main(){ double eps=1e-15; /* precision of calculation */ double a, b, c; double test; char temp; int i=0; do{ printf("\ninitial value a = "); scanf("%lf%c", &a, &temp); printf("initial value b = "); scanf("%lf%c", &b, &temp); test=func(a)*func(b); if(test >= 0){ printf(" bad initial value !! f(a)*f(b)>0\n\n"); } }while(test >= 0); if(b-a<0){ c=a; a=b; b=c; } while(b-a>eps){ c=(a+b)/2; if(func(c)*func(a)<0){ b=c; }else{ a=c; } i++; printf(" %d\t%20.15f\n",i,c); } printf("\nsolution x = %20.15f\n\n",c); return(0); } /*=============================================================*/ /* define function */ /*=============================================================*/ double func(double x){ double y; y=x*x*x-3*x*x+9*x-8; return(y); }

1.2 ニートン法


#include <stdio.h> #include <math.h> #define IMAX 50 double func(double x); double dfunc(double x); /*================================================================*/ /* main function */ /*================================================================*/ int main(){ double eps=1e-15; /* precision of calculation */ double x[IMAX+10]; char temp; int i=-1; printf("\ninitial value x0 = "); scanf("%lf%c", &x[0], &temp); do{ i++; x[i+1]=x[i]-func(x[i])/dfunc(x[i]); printf(" %d\t%e\n", i, x[i+1]); if(fabs((x[i+1]-x[i])/x[i])<eps) break; }while(i<=IMAX); if(i>=IMAX){ printf("\n not converged !!! \n\n"); }else{ printf("\niteration = %d solution x = %20.15f\n\n",i,x[i+1]); } return(0); } /*================================================================*/ /* define function */ /*================================================================*/ double func(double x){ double y; y=x*x*x-3*x*x+9*x-8; return(y); } /*================================================================*/ /* define derived function */ /*================================================================*/ double dfunc(double x){ double dydx; dydx=3*x*x-6*x+9; return(dydx); }

ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成16年9月10日


no counter