- 締切済み
ニュートン法
ケプラー方程式x-e*sin(x)-c=0の解をステップ数とともに出力するプログラムで、e,cはそれぞれ0.5と1です。 xに値を入力して計算させるのですが、どうしてもできません。 下のプログラムリストでおかしいところはどこでしょうか? // ニュートン法 x-e*sin(x)-c=0 #include <stdio.h> #include <math.h> #define e 0.5 #define c 1.0 #define K 10000 double fun(double x); double bibun(int i,double x); float m=1.0,n=1.0; int i=1; main(){ float x1,x2; float z; printf("初期値x0を入力して下さい\n"); scanf("%f",&x1); for(i=0;i<=K;i++){ x2 = x1 - fun(x1)/bibun(i,x1); x1 = x2; z = fun(x1); z = fabs(z); if(fabs(z)<=0.00001){ break; } if(i==K){ printf("収束しません\n"); exit(0); } } printf("解 = %f\n",x1); printf("ステップ数 = %d",i); return 0; } // 関数f(x) double fun(double x1){ double r; r = x1 - e * sin(x1) - c; return r; } // 微分 double bibun(int i,double x1){ float p; if(i%2==1){ p = pow((-1.0),m)*e*sin(x1); m++; } else { p = pow((-1.0),n)*e*cos(x1); n++; } return p; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- koko_u
- ベストアンサー率12% (14/116)
>koko_uさんの考えてるアルゴリズムはどのようなものですか? アルゴリズムはニュートン法なんでしょ。 どうもわかっておられないようなので、ひとまず初期値を 0 とか置いて、 x_0 = 0, x_1 = ◯, x_2 = △, ... と計算して下さい。 その後、計算が面倒なのでコンピュータにやらせるとしたらどうすればいいか考えましょう。
サンプルです。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define e (0.5) #define c (1.0) #define K (10000) #define EPS (0.00001) double f(double x); double g(double x); int main(void) { double x1, x2; int i; printf("初期値x1を入力して下さい\n"); scanf("%lf", &x1); for (i = 0; i < K; i++) { x2 = x1 - f(x1) / g(x1); if (fabs(x2 - x1) <= EPS) break; x1 = x2; } if (i < K) { printf("解 = %f\n", x1); printf("ステップ数 = %d\n", i); } else { printf("収束しません\n"); exit(1); } return 0; } double f(double x) { return x - e * sin(x) - c; } double g(double x) { return 1 - e * cos(x); } (注)インデントのため、全角空白を使っています。
- koko_u
- ベストアンサー率12% (14/116)
とりあえず、double bibun(int i, double x1) がまったくわからん 1. 戻り値が double なのに何故か float p; 2. m, n が唐突に出現。 3. (-1)^m を求めようとして pow( -1.0, m ) としてるの?普通に場合分けじゃね? だいたい、ニュートン法って一階微分がわかれば x_(n+1) = x_n - f(x_n)/f'(x_n) でステップバイステップじゃないの? もっとややこしいことしようとしてるの?
補足
x_(n+1) = x_n - f(x_n)/f'(x_n) でステップバイステップというのがよく分かりません。x_(n+1)を新たなx_nと考えて計算していくんですよね?そうするとsinとcosが交互に出てくると思って、こんな感じにしてしまったのですが。 koko_uさんの考えてるアルゴリズムはどのようなものですか?
お礼
わかりました。 新xについて、新f(x)を微分するということをやっていました。 ニュートン法自体をうまく把握できていなかったようです。 ありがとうございました。