C言語で方程式f(X)=aX^3+bX^2+cX+dの近似解を求める手順を教えてください。
C言語で方程式f(X)=aX^3+bX^2+cX+dの近似解を求める手順を教えてください。
もしよければプログラムもお願いします!
C言語関連・1,446閲覧・500
ベストアンサー
ニュートン法で解を1つ求めて、解を使って3次式を2次式に変えて、解の公式で解を求めてみます。 初期値によっては収束しません。。 /* 3次方程式 */ #include <stdio.h> #include <math.h> #define EPS (1.0e-10) double cubic(double a, double b, double c, double d, double x0) { _double fx, ffx, x=x0; _int i; _for (i=0; i<1000; i++) { __fx=a*x*x*x+b*x*x+c*x+d; /* f(x) */ __ffx=a*x*x+b*x+c; /* f'(x) */ __if (fabs(ffx)<EPS) { ___printf("0 div error\n"); ___return 0; __} __if (fabs(fx)<EPS) break; __x=x-fx/ffx; /* x←x-f(x)/f'(x) */ _} _printf("x=%f\n",x); _return x; } void quad(double a, double b, double c) { _double dis; _if (fabs(a)<EPS) { /* a==0 */ __if (fabs(b)<EPS) { /* b==0 */ ___printf("解なし\n"); __} else { ___printf("x=%f\n",-b/c); __} _} else { __dis=b*b-4.0*a*c; /* b^2-4ac */ __if (fabs(dis)<EPS) { /* ≒0 */ ___printf("x=%f\n", -b/(2*a)); __} else if (dis>0) { /* 実数解 */ ___printf("x=%f\n""x=%f\n", (-b+sqrt(dis))/(2*a), (-b-sqrt(dis))/(2*a)); __} else { ___printf("x=%f%+fi\n""x=%f%+fi\n", -b/(2*a), sqrt(-dis)/(2*a), -b/(2*a), -sqrt(-dis)/(2*a)); __} _} } int main(void) { _double a,b,c,d; /* ax^3+bx^2+cx+d=0 */ _double e,f,g; /* ax^2+ex+f=0 */ _double x,x0; _printf("a b c d ? "); scanf("%lf%lf%lf%lf",&a,&b,&c,&d); _printf("x0 ? "); scanf("%lf",&x0); //printf("%fx^3%+fx^2%+fx%+f=0\n",a,b,c,d); _x=cubic(a,b,c,d, x0); /* 解を1つ求める */ _/* 解を使って次数を下げる */ _e=x*a+b; _f=x*e+c; _g=x*f+d; _if (fabs(g)<EPS) { //_printf("%fx^2%+fx%+f=0\n",a,e,f); __quad(a,e,f); /* 二次方程式を解く */ _} _return 0; } 実行例 a b c d ? 1 1 1 1 x0 ? 0 x=-1.000000 x=-0.000000+1.000000i x=-0.000000-1.000000i
質問者からのお礼コメント
ありがとうございました。参考にさせていただきます。
お礼日時:2008/11/27 21:12