• ベストアンサー

f(x) = 0の解をもとめる

tatsu99の回答

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

前提として以下の条件が必要です。 開始点:aと終端:bの間に解が1つだけ存在すること。 f(a)~f(b)まで連続してf(x)が定義されていること 以下は、開始点:aと終端b:が与えられた時に、 f(x)=0となるxを求める方法です。 f(x)=A*x*x + B*x + C (A=4 B=6 C=-10)としてあります。 -------------------------------- #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> //2分法による解の算出 double Fx(double x) { double A = 4.0; double B = 6.0; double C = -10.0; double fx = A*x*x + B*x + C; return fx; } int main (int argc, char **argv) { double a = atof(argv[1]); double b = atof(argv[2]); double c; double fx,fx1,fx2; double low = a; double high = b; int ctr = 0; //始点aと終端bを印字 printf ("a=%lf b= %lf\n",a,b); fx1 = Fx(a); fx2 = Fx(b); if (fx1 == 0.0){ printf("解=%lf\n",a); return(0); } if (fx2 == 0.0){ printf("解=%lf\n",b); return(0); } if (fx1 * fx2 > 0){ printf("解無し\n"); return(0); } while(1){ ctr++; c = (low + high)/2.0; fx = Fx(c); if (fabs(fx) < 0.000000001){ printf("実行回数=%d 解=%lf\n",ctr,c); return(0); } if (fx1 * fx > 0.0){ low = c; }else{ high = c; } if (ctr > 10000){ printf("実行回数オーバー\n"); return(0); } } return 0; } --------------------------------------

hikou
質問者

お礼

ソースまで見せていただき本当にありがとうございます。 今日、ようやく実機にて確かめることができました。 最終的な結果としては以下のような形が望ましいのですが、 なにかよいアドバイスはないでしょうか。 せめて最後の行くらい出れば・・・・ (ずうずうしいお願いなのでもしお手が空いてればで結構です。) double func(double x) { return x * x - 1; } int main() { double x; int loop = bisection_method(&func, &x, -10, 10, 100, 0.001); ???(なにかの処理) printf("func(%f)=%f loop=%d\n", x, func(x), loop); ???(なにかの処理) return 0; } loop x1 x3 x2 f(x3) 0 -10.000000 0.000000 10.000000 -1.000000 1 0.000000 5.000000 10.000000 24.000000 2 0.000000 2.500000 5.000000 5.250000 3 0.000000 1.250000 2.500000 0.562500 4 0.000000 0.625000 1.250000 -0.609375 5 0.625000 0.937500 1.250000 -0.121094 6 0.937500 1.093750 1.250000 0.196289 7 0.937500 1.015625 1.093750 0.031494 8 0.937500 0.976563 1.015625 -0.046326 9 0.976563 0.996094 1.015625 -0.007797 10 0.996094 1.005859 1.015625 0.011753 11 0.996094 1.000977 1.005859 0.001954 12 0.996094 0.998535 1.000977 -0.002928 13 0.998535 0.999756 1.000977 -0.000488 func(0.999756)=-0.000488 loop=13

関連するQ&A

  • f(x)=0の近次解を求める数値計算について 

    方程式 f(x)=0  の近次解を求める数値計算に関する質問です。 代表的な計算方法には二分法、はさみうち法、ニュートン法、逐次代入法 などがあるようですが、 f(x)が以下のような関数であるときどのように近似解を求めたらよいでしょうか? (1)  f(x)はどのxに対しても常にf(x)≧0となるような関数 (2)  f(x)=0 となるxはただ一つだけである (2)  f(x)は非常に複雑な関数でf(x)を微分するのは困難 趣味で行っている3Dのモデリングに関するプログラム中に必要になった関数で、 このような関数に対し、二分法をベースにしたプログラムをつくってみましたが、 非常にだらだらとしたアルゴリズムでなっとくできません。 この関数に適したよいを御存知の方おられましたら御回答くださいませ。 またもしf(x)が  (4)  f(x)= |2x+3| のように f(x)が0になるまでは単調減少で、0になってからは単調増加である という条件がさらに加わった場合どうなるかについてもご解答いただけると助かります。

  • xの関数f(x)に対して、式

    xの関数f(x)に対して、式 f(x)=-f(-x) および式 f(2x)=(a×4^x+a-4)/(4^x+1) が成り立つ。ただし、aは実数の定数である。 このときのaの値と、 f(x)の逆関数についてf^-1(3/5)の値の求め方を教えてください。 回答よろしくお願いします。

  • f(x)の役割について

    例えばf(x)=2xがあるとします。 このとき、f(x)は2xによって変換される値として置かれているだけで、f(x)という書き方でそれはxの関数であることを示しています。 しかしこのf(x)がある値を2倍するという操作をしているわけではなく、2xがしています。 つまり、f(x)は値であり、xの関数であることを示している以外に何か意味を持ってますか? 機能を言うならfですよね。 fは写像としての役割を果たしているので、ある値をある値に対応(つまり言い方を変えるとある値をある値に変換)しているので、ある値を2倍しているのはfであるとも言えると思います。 だから、f(x)というものは機能を持たず、それは単なる値にすぎなくて、fが機能を持っているのですよね? また、2xなどの(xの式)と同じ機能を持っていますよね? 最後に、f(x)をxの関数、またはfをxの関数というのは、どちらが正しいのでしょうか? どちらでもいいのでしょうか。 fが関数というのは、fは写像(別の言い方で関数)だからで、f(x)の場合はf(x)は値で、xの値が一つ決まればf(x)の値も一つ決まりますし。どちらでもいいとは思いますが。 関数の意味の定義の仕方の違いだと思います。fが関数だと言う場合は写像を意識し、f(x)の場合は値を意識しているかと思います。

  • f(x)がx=aで微分できるか

    xf(x)が、ある点a(a ≠0)で、微分できるとし、またfがaで連続だとすると、fがx=aで微分可能であることを示せという問題なのですが、 xf(x)を微分してみて、 (xf(x) )'=x(f(x))'+f(x)という風になると思うのですが、ここでよくわからないのですが、 もしf(x)がaで微分不可能だとしたら、a(f(a))'+f(a)の値はどうなるのでしょうか? 只単にf(a)だけになるのでしょうか? もしこれでa(f(a))'+f(a)の値がf(x)がaで微分できないから値なしということならば、値はあるはずだからaで微分可能という風になるのかなと思いまして... 回答よろしくお願いします。

  • ∂f/∂x=∂f/∂yの表される解を考えてみました

    ∂f/∂x=∂f/∂y ・・・・・・・(1) の解について (1)を満たす解f(x,y)はz=x+yとしてf(x,y)=C(z) (C(z)はzについて微分可能な任意関数)である。 しかしこの解がそれ以外で表されるか否かというのを考えてみました。 (考察) f(x,y)が(1)の解であるならば、zを任意の定数として固定してy=-x+zのとき 合成関数の微分法を用いて df(x,-x+z)/dx=0 である。 これをf(x,-x+z)について解くと、f(x,-x+z)=C(z) (C(z)はzのみに依存する任意関数) すなわち df(x,-x+z)/dx=0 ⇔ f(x,-x+z)=C(z)                    ⇔ f(x,y)=C(x+y)  ・・・・・・・・・・・(2) しかし(1)に代入するとC(x+y)はx+yについて微分可能でないといけないことが分かるので 結局(2)は  df(x,-x+z)/dx=0 ⇔ f(x,y)=C(x+y) (C(x+y)はx+yについて微分可能な任意関数) ・・・・・・(2)' となる。 逆に(1)を満たす解の中でf(x,y)=C(x+y)の形以外の適当なx,yに依存する関数F(x,y)を考える。 y=-x+z(zは任意定数)と制限されれば x+yのみに依存する任意関数C(x+y)をとっても F(x,y)≠C(x+y)であるから (2)'からdF(x,-x+z)/dx≠0     つまりy=-x+zのとき dF(x,-x+z)/dx=∂F/∂x+dy/dx・∂F/∂y=∂F/∂x -∂F/∂y≠0 で このときF(x,y)は(1)を満たさない。 したがって(1)を満たす解はz=x+yとして f(x,y)=C(z) (C(z)はzについて任意の微分可能な関数)でしか表せない事が分かった。 この説明方法に誤り、アドバイスあれば指摘してください。 問題は(1)の解でy=-x+zと制限すれば必ずdf(x,-x+z)/dx=0なるという情報が分かっている。 F(x,y)をy=-x+zで制限されたときF(x,-x+z)/dx ≠0だから(1)はこのとき満たされないため f(x,y)=C(x+y)のみしか表せないと考えたのであるが、それでよいかどうか。 fが(1)の解 ⇒ y=-x+zのとき df(x,-x+z)/dx=0 これより  y=-x+zのときdF(x,-x+z)/dx≠0 ⇒ Fは(1)の解でない  だから (1)の解はf(x,y)=C(x+y)のみというのが自分の考え。

  • f(f(x)) みたいなこと出来ないでしょうか?

    f1(x)=x^2+x+3=10 , f2(x)=(f1(x))^2+f2(x)+3 , f3(x)=(f2(x))^2+f3(x)+3 ・・・・・・ fN(x)=(f(Nー1)(x))^2+f(N-1)+3 Nに数字を入れると FN(x)の値がわかるような方法はないでしょうか? 数列のような気もするのですが・・・ fの後に続く文字は第何項という意味です わかりにくくてすみません><

  • f(x0)について

    初歩的な質問で申し訳ないのですが f(x0)のx0は何を示しているのでしょうか? x^0ではなく、Xoみたいにエックスの右下にゼロがついているやつです。 参考書もまだ揃えられている状況ではないので質問させていただきました。 回答よろしくお願いします。

  • ニュートン法で、f(x)=2sin(x)-0.5x+1=0の解を求める

    ニュートン法で、f(x)=2sin(x)-0.5x+1=0の解を求めるとき、x1=0を初期値として計算すると、x3はいくらになりますか?

  • (x)=3x2に対してf(2)の値を求めてください

    (x)=3x2に対して、f(2)の値を求めてください。 おねがいします!

  • 関数f(x)=e^2x-2e^x

    (1) f(x)=0になるxの値、lim[x→+∞]f(x)、lim[x→-∞]f(x) (2) f(x)の最小値とその時のxの値 どういうグラフの概型になるかもお願いします。