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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1259閲覧

Newton法と誤差について

Co-Min

総合スコア11

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/05/19 12:46

編集2019/05/19 12:47

Newton法でf(x)=0の解を求めるプログラムをC++で作っています。
f(x)=10sin(x)+e^x
反復回数が6回になると思うのですが、そうすると誤差の計算(最後のfor文)がおかしくなってしまいます。5回だと上手くいく気もするのですが、、
どっちが正しいのでしょうか?間違っている箇所があれば教えてください。
恐らく近似解は-9.139306700409e-02
誤差は最後の反復で1.85e-11になると思います。

#include<stdio.h>
#include<math.h>

double f(double x){
return 10sin(x) + exp(x);
}
double df(double x){
return 10
cos(x) + exp(x);
}

int main(){

int k;
const int Max = 50;//最大反復回数
int N = 0;//反復回数
double x0 = 1.0;//初期値
double eps = 1e-12;//許容誤差
double X_n[Max + 1];//近似解を保存する数列
X_n[0] = x0;

for(int k = 0; k < Max; k++){
if(fabs(f(X_n[k])) < eps){
N = k + 1 ;
printf("反復回数は%d回\n", N);
printf("近似解は%.12e\n", X_n[k]);
break;
}
X_n[k + 1] = X_n[k] - (f(X_n[k]) / df(X_n[k]));
}
for(int j = 1; j < N; j++){
printf("%d \t %.12e \t %.2e\n" , j, X_n[j], fabs(X_n[j]-X_n[k]));
}
return 0;
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

最後のprintf文は、最終的な近似解とそれまでの近似解との誤差を出力してるかと思われます。

しかし、kは1つ目のfor文内でしか値が適用されない変数なので、fabs(X_n[j]-X_n[k])では適切な値になりません(環境によってはコンパイルエラーになります、自分の環境ではそうなりました)

最後のprintf文について、X_nkをkを使わず以下のように書き換えるとうまくいくんじゃないかと思います。

#修正前 printf("%d \t %.12e \t %.2e\n", j, X_n[j], fabs(X_n[j] - X_n[k])); #修正後 printf("%d \t %.12e \t %.2e\n", j, X_n[j], fabs(X_n[j] - X_n[N-1]));

ご参考になれば幸いです。

投稿2019/05/20 02:13

amahara_waya

総合スコア1029

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問