前提
f (x)=x/(x^2+1)とし,方程式 f (x) = 0を,ニュートン法を用いたC言語プログラムで解く。
以下のことができるようにする
実現したいこと
●繰り返し回数をiとし,i=0の初期値(x0とする)はプログラム中に書き,画面の最初に「x0=○○○○ 」と表
示させる。
● i=1以降は反復計算により各iにおける近似解候補(xiとする)を計算し,1段階前のxi (dxiとする)との差
(dとする)も求める。
誤差限界をEPS,最大反復回数をKMAXとし,それぞれ10−6,20とする。
計算の途中経過がわかるように,画面に
i xi dxi d
1 ○○○○ ○○○○ ○○○○
2 ○○○○ ○○○○ ○○○○
・・・
と表示させる。
●近似解が求められたら「x=○○○○」と表示,最大反復回数まで計算して近似解が求められなければ
「収束しない」と表示させる。
[プログラム中で,関数はプリプロセッサ制御文で定義し,f(x)とその導関数g(x)=f'(x)に相当するものを
それぞれF(x), G(x)とする。定数EPS, KMAXもプリプロセッサ制御文で定義する。]
発生している問題・エラーメッセージ
f(x)は手計算すると0に収束するはずなのですが,収束してくれません.もしかして収束しないのでしょうか.以下に結果を書きます. x0=1.000000 i xi dxi d 1 5.333333 2.000000 3.000000 2 11.055331 5.333333 5.000000 3 22.293064 11.055331 11.000000 4 44.676025 22.293064 22.000000 5 89.396835 44.676025 44.000000 6 178.816040 89.396835 89.000000 7 357.643250 178.816040 178.000000 8 715.292114 357.643250 357.000000 9 1430.587036 715.292114 715.000000 10 2861.175537 1430.587036 1430.000000 11 5722.352051 2861.175537 2861.000000 12 11444.704102 5722.352051 5722.000000 13 22889.408203 11444.704102 11444.000000 14 45778.816406 22889.408203 22889.000000 15 91557.632812 45778.816406 45778.000000 16 183115.265625 91557.632812 91557.000000 17 366230.531250 183115.265625 183115.000000 18 732461.062500 366230.531250 366230.000000 19 1464922.125000 732461.062500 732461.000000 20 2929844.250000 1464922.125000 1464922.000000 21 5859688.500000 2929844.250000 2929844.000000
該当のソースコード
#include <stdio.h> #include <math.h> #define EPS 1.0e-6 #define KMAX 20 #define f(x) ((x)/((x)*(x)+1)) #define g(x) ((-1*(x)*x+1)/(((x)*(x)+1)*((x)*(x)+1))) void main() { float xi, dxi, d; xi = (dxi = 1) + 1; // 初期値:1 printf_s("x0=%f\n", dxi); printf_s("i xi dxi d\n"); d = 1; for (int i = 1; d > EPS; i++) { dxi = xi; xi = -1 * (f(dxi) / g(dxi)) + dxi; d = abs(dxi - xi); printf_s("%d %f %f %f \n", i, xi, dxi, d); if (i > KMAX) { break; } } }
試したこと
dxi=0にしてみましたが,発散してしまいました.
補足情報(FW/ツールのバージョンなど)
Visual Studio 2022を使用しています.
回答1件
あなたの回答
tips
プレビュー