• ベストアンサー

最小値を表示させる方法

x^3-3x-1=0の正の解のうち最も小さいものを表示させるプログラムを造りたいのですが、方程式の計算をするところまではできました。しかし、このあと、最も小さい解を表示させる方法が分かりませんので教えてください。 #include<stdio.h> #include<math.h> double main(void) { double x,f; for(x=0;x<=2;x+=0.001){ f=x*x*x-3*x-1; if(f>=0) printf("%lf\n",f); } return 0; }

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#1の方と似ていますが、 最小値を保持する変数を用意して fの絶対値と最小値の変数を比べます そしてループが終わった後で表示します。 具体的な、変更したソース。 #include<stdio.h> #include<math.h> int main(void){ double x,f; double miny=1.0,minx=0.0; for(x=0;x<=2;x+=0.001){ f=x*x*x-3*x-1; if(fabs(f)<miny){ miny=fabs(f); minx=x; } } printf("x=%f,f=%f\n",minx,minx*(minx*minx-3)-1); return 0; } 参考に、ニュートン法を使った方法 /* f(x)=x^3-3x-1=0 の解をx=2.0から始めてe=10^(-10)の範囲で求める */ /* ニュートン法: f'(x)=3x^2-3 点(a,b)を通り傾き3a^2-3の直線は y-b=(x-a)(3a^2-3) x軸との交わる時のxは x=-b/(3a^2-3)+a */ #include <stdio.h> #include <math.h> void main(void){ double xold,xnew,e; unsigned c=0; e=pow(10,-10); xnew=2.0; do{ c++; xold=xnew; xnew=(1.0+xold*(3-xold*xold))/(3.0*(xold*xold-1.0))+xold; }while(fabs(xnew-xold)>e); printf("繰り返し数(%u):x=%#12.11g,e=%#g\n",c,xnew,e); }

rankle
質問者

お礼

 ニュートン法と2分法の参考ソースまで分りやすくかいていただいて、とても助かりました。これからの参考にさせていただきます。ありがとうございました。

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

参考その2 /* f(x)=x^3-3x-1=0 の解をx=2.0と1.0から始めてe=10^(-10)の範囲で求める */ /* 2分法: f(x)がプラスとマイナスになる値の間に解がある */ #include <stdio.h> #include <math.h> void main(void){ double xM,xP,x,e; unsigned c=0; e=pow(10,-10); xP=2.0; xM=1.0; do{ c++; x=(xM+xP)/2.0; /* x軸との交点の方がいいかも */ if(x*(x*x-3)-1>=0) xP=x; else xM=x; }while(fabs(xP-xM)/2.0>e); printf("繰り返し数(%u):x=%#12.11g,e=%#g\n",c,x,e); }

  • chokuto
  • ベストアンサー率40% (2/5)
回答No.2

3次方程式は代数的な解法としてCardano(カルダノ)の公式が ありますが、それでいかがでしょうか。 (やっぱり数値的解法の方をお望みですかね)

  • jurarumin
  • ベストアンサー率34% (190/544)
回答No.1

最小値を格納する変数を作って、 for文の中で解を求める度に変数の値と比較して、 小さければ変数に代入していけば良いのでは? ※変数の初期値は、forで求めた最初の値を格納する。

関連するQ&A