• ベストアンサー

C言語で非線形方程式を解くプログラム

非線型方程式((a*a)+(x*x))(1-x)-bx=0 という式で a=0.07,b=0.10のときの解をすべて解きなさい(プログラムで2分法又はニュートン法を用いて解く)という問題を解きたいのですが色々なサイトを見てもわかりません もしよろしければどなたか教えていただけませんか? よろしくお願いします。

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

  • ベストアンサー
回答No.3

これは GnuPlot との併設が必要な引っかけ問題ですね。 http://t16web.lanl.gov/Kawano/gnuplot/ 答えは、一見、3次方程式から3つあるように見えますが、実は一つなんですね。 x->+0 の箇所は、 y=0 であるかのように見えますが交わっておらず、y=0 に近似しており、そのxの値を得ようと精度を上げてやると無限ループに落ちてしまう、いやはや、やっかいな問題です。 出題者も良くおわかりのようで。まあ、 GOSA の精度をあげてお試しください。 /* 二分法: result x= 0.879862 count= 9 gosa= 1.000000e-02 */ #include <stdio.h> #include <math.h>//sin(),cos()等用 #define GOSA 1e-2 //←「1e-3」以上にすると無限ループに落ちる #define BEGIN 0.5 //0.0 #define END 1.0 //0.2 #define F(x) (0.07*0.07+(x*x))*(1.0-x)-0.1*x int main(void) { int count = 0; double x0, x1, x, f0, f1, tx, temp_fx = 1.0; x0 = BEGIN; x1 = END; while (fabs(temp_fx) > GOSA) { count += 1; f0 = F(x0); f1 = F(x1); x = (x0 * f1 - x1 * f0) / (f1 - f0); temp_fx=F(x); fprintf(stderr, "%3d: \tx0= %f \tx1= %f\t x= %f \t fx= %f\n", count, x0, x1, x, temp_fx); tx = x; if (f0 * temp_fx < 0.0) x0 = x; else x1 = x; } printf("result x= %f count= %d gosa= %e\n", x, count, GOSA); return 0; }

sa-syo
質問者

お礼

ありがとうございます。 これからもっと勉強してできるようにがんばります。

その他の回答 (2)

回答No.2

2分法にしても、ニュートン法にしても、初期値の選び方を間違えると失敗するという、ちょっと手強い関数ですね。 ただ、「こんな場合にはうまくいきません」ということで、必ずテキストに説明があるケースなのでそこを復習するという感じかと。 ちなみに、f(x) = ((a*a)+(x*x))(1-x)-bx のグラフは添付した形になります。 難しさがわかっていただけるといいかなと。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

何が分からないのですか?

関連するQ&A

  • C言語のプログラムの問題で質問です。

    C言語のプログラムの問題で質問です。 問題は、 与えられた実数(a,b,c,d)に対して、次の連立非線形方程式の解 を「ニュートン法」を用いて解く。 f1(x,y)=y+ax^2-b=0 f2(x,y)=y^2+cx^2-d=0 ただし初期値(a,b,c,d)を入力でき、上記の方程式の解が画面表示されること。 という問題です。 普通の連立方程式を解くプログラムならできるのですが、ニュートン法 で解くというのが分かりません。 プログラムを教えてください。参考にしたいです。

  • C言語のプログラムの問題で質問です。

    C言語のプログラムの問題で質問です。 問題は、 与えられた実数(a,b,c,d)に対して、次の連立非線形方程式の解 を「ニュートン法」を用いて解く。 f1(x,y)=y+ax^2-b=0 f2(x,y)=y^2+cx^2-d=0 ただし初期値(a,b,c,d)を入力でき、上記の方程式の解が画面表示されること。 という問題です。まず、どういう方針で作っていくのかが分かりません。 できるのなら参考例を挙げてもらえればありがたいです。お願いします。

  • C言語のプログラムについて

    下記は、何言語かわからないです。 これをC言語にするにはどうすればよいでしょうか。 プログラムは、「ニュートン法を用いて、方程式x^3(xの3乗)-4=0の近似解を求めるプログラム。ただし、実数解と、近似解の誤差は、0.0001以下とする。ここで、この方程式の導関数は、3x^2(3*xの二乗)である。」 100 DEF F(X)=X*X*X-4 110 DEF G(X)=3*X*X 120 INPUT PROMPT "初期値":A 130 LET B=A-F(A)/G(A) 140 IF ABS(A-B)<=.0001 THEN 170 150 LET A=B 160 GOTO 130 170 PRINT "近似解";B 180 END 以上です。 ご回答よろしくお願いいたします。

  • 3連立非線型方程式の解法プログラム(ニュートン法)を教えてください

     未知数が3つで非常に難解な非線型方程式を3連立方程式にして解きたいと思っています。  ですが、手計算による代入法等の解法を行うと、とんでもなく式が長くなってしまいとても解けません。そこでc言語のプログラミングにて計算し、3連立方程式から3つ未知数の解を求めたいのですが、プログラミングはまったくの初心者であるため、いまいちよく分かりません。  解法プログラミングとしてはニュートン法が最も適切だとお聞きしました。ニュートン法にて例として下記のような式を解く場合、どのようにプログラムすれば良いか教えていただけたら幸いです。 例 2*x*x*x + 4*x*y + cos(z) = 0 x*x*y*z + logz + 2*y = 0 2*x*x + y*z +z*z*z +4 + e~(-xy) =0  この例は私が勝手に作成したので解は存在しているかわかりませんが、実際にこのような3連立非線型方程式を解く場合はどのようなプログラムになるか教えていただけたら幸いです。また、実際に私が解こうと思っている式はこの例より非常に長いものとなっています。あつかましいようですがそのことを考慮に入れてお教え頂けたら幸いです。何卒お願いいたしします。

  • 2次方程式

    2次方程式x^2-(a+5)x-3bの2つの解は、2次方程式x^2+bx+a=0の2つの解をそれぞれ2倍したものである。a,bの値を求めよ。 どうやって解くかわかりません(>_<)

  • ニュートン法をC言語でプログラム

    方程式 cos^2x-0.5=0 (0<x<π) の解をニュートン法で求める という問題をC言語のプログラムを作り計算したいのですが分かりません。 自分で考えてみたプログラムは以下の通りです。 #include <stdio.h> #include <math.h> #define f1(x) cos(x)*cos(x)-0.5 #define f2(x) sin(2*x) /* ニュートン法による方程式の解 */ main() { double x0,x1,a,b,c,d,g,n; a=1; x0=0.7; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解 x= %f \n", a,x1); x0=x1; } } 自分としてはこれが精一杯で、何故間違ってるのか、何をどうすればいいのか、さっぱり分かりません。どういったところが間違ってるのか可能性だけでも示して頂ければ幸いです。 参考として、ニュートン法によるプログラム例として書かれていたものを上げさせて頂きます。 例: e^x-3=0 の解をニュートン法により計算する。 #include <stdio.h> #include <math.h> #define f1(x) exp(x)-3 #define f2(x) exp(x) /* ニュートン法による方程式の解 */ main() { double x0,x1,e,a,b,c,d,g,n; a=1; x0=3; n=0; while(a>0.0001){ b=x0; d=f1(b); g=f2(b); x1=x0-d/g; c=x1; a=f1(c); n=n+1; printf(" n= %f x1=%f x0=%f\n",n,x1,x0); printf(" a= %f → 解  x= %f \n", a,x1); x0=x1; } }

  • 3次方程式の実数解をニュートン法でプログラムしたいのですがどう手をつけ

    3次方程式の実数解をニュートン法でプログラムしたいのですがどう手をつけていいか分かりません・・・ √を求めたりする簡単な方法はプログラムはできました 式はx^3-7*x^2+18*x-18=0です まだまだ初心者lvを抜け出せません・・・よろしくお願いします

  • 2次方程式の2つの解 α β

    2次方程式x^2+ax+b=0の2つの解をα、β(α<β)とするとき、α+β、α-βを2つの解とする2次方程式の1つがx^2+bx+a=0である。このとき、定数a、bの値を求めよ。ただし、b≠0とする。 ―――――――――― 解と係数の関係より α+β=-a・・・・(1) αβ=b・・・・・・(2) またx^2+bx+a=0の2解がα+β、α-βであるから 解と係数の関係より (α+β)+(α-β)=-b (α+β)(α-β)=a ―――――――――― ここまでは考えたのですが、この後どうしたらいいのかわからず悩んでいます。 よろしくお願いします。

  • 二次方程式の問題

    この問題を解く手順を教えてください。 質問者は高2です。 実数a,bを係数とする二次方程式x^2+ax+b=0の解をα,βとする。 1/αと1/βを解に持つ二次方程式がx^2+bx+a=0のとき、a,bの値を求めよ。

  • 4次方程式の解

    クリックありがとうございます(∩´∀`)∩ ★4次方程式 x^4-3x^3+ax^2+bx-4=0 の解のうち,2つが1と2であるとき、定数a,bの値と他の解を求めよ。 (答)a=0,b=6,他の解は±√2 1と2が解であるから 1-3+a+b-4=0,16-24+4a+2b-4=0 すなわちa+b=6,2a+b=6 連立方程式を解いて a=0,b=6 よって方程式は x^4-3x^3+6x-4=0 ここまでやったのですが↑の式をx-6で割っても割り切れません。 この問題の説明をお願いします。