• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:間違い?jacobiを用いたnewton法)

間違い?jacobiを用いたnewton法

このQ&Aのポイント
  • 以下のプログラムを作ったんですが実行したときに答えがnanになります。
  • どなたか間違いがわかる方よろしくおねがします。
  • プログラムの修正方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

ANo.1 = 2 です。 バラバラ書いてごめんなさい。 > x[i+1]=x[i]-(dgdy(x[i],y[i])*f(x[i],y[i]))-(dfdy(x[i],y[i])*g(x[i],y[i]))/det2; これはいいけど、 > y[i+1]=y[i]-(dgdx(x[i],y[i])*f(x[i],y[i]))-(dfdx(x[i],y[i])*g(x[i],y[i]))/det2; これ、プラスマイナスの付け方間違っていませんか? というのは、ニュートン法を使うためにヤコビ行列の逆行列を使いますよね? まずは、逆行列が存在しないケース(すなわち行列式=0の場合)が抜けていませんか、というのがANo.1,2 の指摘。今回の指摘は、逆行列に f(x,y), g(x,y) を書けるのにプラスマイナスが間違っちゃってませんか、という指摘です。 プログラム云々の前に手で数式を展開して、最初の1、2回目程度手計算した結果とプログラムが吐き出す答えをつき合わしてみてはいかがでしょうか。

その他の回答 (2)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

というか、その前に、 > double det(double a,double b) という関数はきっと行列式を計算したいのだと思うけど、 > ans=1/(dfdx(a,b)*dgdy(a,b)-dfdy(a,b)*dgdx(a,b)); って、 det = dfdx(a,b)*dgdy(a,b)-dfdy(a,b)*dgdx(a,b); じゃないですか?

  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

> 実行したときに答えがnanになります。 というのは、ループの何回目からですか? そのときのx,yの値は? ans=1/(dfdx(a,b)*dgdy(a,b)-dfdy(a,b)*dgdx(a,b)); で、分母が0になる可能性は? まずはここにエラー処理を入れてみませんか? それから、 > const double e =1e-10; というのはどこかで使ってますか? > enum {N=100}; としながら、forループが20回なのはなぜですか?

関連するQ&A