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

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

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

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

C++

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

Q&A

解決済

1回答

842閲覧

C言語を用いたニュートン法による非線形方程式解法プログラムを作成していますが,収束するはずの関数が収束しません

Thiara

総合スコア14

C

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

C++

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

0グッド

0クリップ

投稿2022/06/08 13:49

前提

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を使用しています.

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

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

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

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

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

melian

2022/06/08 15:00

初期値が 1 では確かに収束しないでしょうね。。。 xi = (dxi = 0.1) + 0.1; くらいにしてみてはどうでしょう。また、Google サイトで "x/(x^2+1)" で検索するとトップにグラフが表示されるので、極値を確認してみるとよいかと。
guest

回答1

0

自己解決

dxi=0.5にしてみたところ収束しました.

投稿2022/06/08 15:06

Thiara

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問