質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

399閲覧

ニュートン法について

yu3sukei22

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/24 18:29

以下のコードを書きましたがうまく作動しません
cの関数の仕組みもあまり理解していないので厚かましいですが説明をお願いしたいです

c

1#include <stdio.h> 2#include <math.h> 3double f(double X_n){ 4 return 10*sin(X_n)+exp(X_n)//f(x) 5} 6double df(double X_n){ 7 return 10*cos(X_n)+exp(X_n);//f'(x) 8} 9//おそらく上の書き方が間違ってる?? 10int main(void){ 11 const int M=50;//最大反復回数 12 int N=0;//反復回数 13 double x0=1.0;//初期値 14 double X_n;//近似解を保存する数列(配列) 15 X_n=x0; 16 double epilon=1e-12;//許容誤差 17 for(int i=0;i<=M;i++){ 18 if (abs(f)<epilon){ 19 printf("%.12eで%d",X_n,N); 20 break; 21 }else{ 22 X_n=X_n-f/df; 23 N++; 24 } 25 } 26 return 0; 27}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

abs(f)
X_n = X_n - f / df;
fdfで得られるのは関数のアドレスです。

やりたいことは以下でしょうか?
fabs(f(X_n))
X_n = X_n - f(X_n) / df(X_n);


;が抜けています。

diff

1double f(double X_n){ 2- return 10*sin(X_n)+exp(X_n)//f(x) 3+ return 10*sin(X_n)+exp(X_n);//f(x) 4}

うまく作動しないという以前にそもそもコンパイルエラーになると思うのですが…


epilonとの比較はfabs(f(X_n))ではなく、前回の計算結果との差分を取らないといけないのでは?
fanaさんのご指摘通りfabs(f(X_n))でも問題ありませんね。

diff

1int main(void) { 2 const int M = 50;//最大反復回数 3 int N = 0;//反復回数 4 double x0 = 1.0;//初期値 5 double X_n;//近似解を保存する数列(配列) 6 X_n = x0; 7 double epilon = 1e-12;//許容誤差 8 for (int i = 0; i <= M; i++) { 9+ double X_n1 = X_n; 10+ X_n = X_n - f(X_n) / df(X_n); 11+ N++; 12- if (abs(f)<epilon){ 13+ if (fabs(X_n - X_n1) < epilon) { 14- printf("%.12eで%d",X_n,N); 15 break; 16+ } 17- }else{ 18- X_n=X_n-f/df; 19- N++; 20- } 21 } 22 } 23+ printf("%.12eで%d", X_n, N); 24 return 0; 25}

投稿2020/05/24 18:57

編集2020/05/25 02:12
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu3sukei22

2020/05/24 19:21

ご回答の方ありがとうございます「;」はコメントを書く際に間違えて消していたのを気づいていませんでした。上記の通り修正したところ反復回数1の-3.708377940799e-01となりパッと見て違うように見えるのですが、どこが間違ってるのでしょうか
SHOMI

2020/05/24 19:34

epilonとの比較はfabs(f(X_n))ではなく、前回の計算結果との差分を取らないといけないのでは?
fana

2020/05/25 01:44

> epilonとの比較はfabs(f(X_n))ではなく、前回の計算結果との差分を取らないといけないのでは? 「f(x)=0 となるxを求めたい」のでしょうから,「|f(x)|の値が十分小さい」ことを終了条件とするのは自然かと思います.
SHOMI

2020/05/25 02:01

>「f(x)=0 となるxを求めたい」のでしょうから,「|f(x)|の値が十分小さい」ことを終了条件とするのは自然かと思います. あ、どちらでも大差ないですね
SHOMI

2020/05/25 02:04 編集

>上記の通り修正したところ反復回数1の-3.708377940799e-01となり こちらでは「-9.139306700409e-02で5」と出ましたが…
guest

0

ベストアンサー

概ねこんな感じでしょうか.

int main(void) { const int M=50;//最大反復回数 const double epilon=1e-12;//許容誤差 int i; double F, dF; double X_n = 1.0; //初期値 for( i=0; i<=M; i++ ) //iが「反復回数」だから,元々存在した変数Nは不要 { //関数の計算結果を変数FとdFに格納して使うことにする F = f(X_n); dF = df(X_n); //デバッグ用に経過を表示しよう printf( "[i=%d] x=%.12f, f(x)=%.12f, df(x)=%.12f\n", i, X_n, F, dF ); //収束判定. //dFについても別途必要かも(極値付近でまともに解を更新計算できないと思うので). if( fabs(F)<epilon ) { printf"(Finish by Thresh)\n"; break; } //解の更新 X_n = X_n - F/dF; } //結果表示 printf( "Result : [i=%d] x=%.12f, f(x)=%.12f, df(x)=%.12f\n", i, X_n, F, dF ); return 0; }

df(x)の値が0(または非常に0に近い値)だと,解の更新時に値がすっ飛ぶ可能性があるので,
df(x)の値に関する判定も入れた方が良いように思います.

投稿2020/05/25 01:38

編集2020/05/25 02:16
fana

総合スコア11708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2020/05/25 01:55

結果表示は Result : [i=5] x=-0.091393067004, f(x)=0.000000000000, df(x)=10.870924502492 となりました
SHOMI

2020/05/25 02:13 編集

doubleなので、(C言語では)absではなくfabsですね。 C言語の質問なのに一か所std::coutを使っていますよ
fana

2020/05/25 02:16

> abs ほんとだ! 質問コードのままになってました.(C++だとオーバーロードされてるので気付かなかった…) coutの件も含めて修正しました.
yu3sukei22

2020/05/25 02:33

fanaさんSHOMIさんありがとうございます! 無事解決いたしました
SHOMI

2020/05/25 02:37

反復回数1の-3.708377940799e-01と出た件は解決したのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問