• ベストアンサー

数値解析のはさみうち法について

はさみうち法を使い数値計算をするプログラムで、解の近似値を求める式についてなんですが、 2点a,bを結んでx軸との交点をxにした時、  x=(a * f(b) - b * f(a)) / (f(b) - f(a));と  x=a-(b-a)/(f(b)-f(a))*f(a); の2通りの式で実行してみると、両方同じ近似値を求めることが出来たのですが、どちらの式も本当に正しい式なのでしょうか? よろしくお願いします。             

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

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

下の式を変形すると上の式になります。 同じ式です。 a-{(b-a)*f(a)}/{f(b)-f(a)}= a*{f(b)-f(a)}/{f(b)-f(a)}-{(b-a)*f(a)}/{f(b)-f(a)}= {{a*f(b)-a*f(a)}-{b*f(a)-a*f(a)}}/{f(b)-f(a)}= {a*f(b)-a*f(a)-b*f(a)+a*f(a)}/{f(b)-f(a)}= {a*f(b)-b*f(a)}/{f(b)-f(a)}

docwono
質問者

お礼

回答どうも有り難うございました。自分でも計算してみて確認できました。

関連するQ&A

  • はさみうち法のプログラム(C言語)について

    調べたりしながら私なりに書いてみたのですが上手くいきません。 「ans=1.048404」とならなければいけないのに 「nan」で返ってきてしまうのです。 どこをどの様に変えたら良いのでしょうか・・・? ※課題の締め切りが近いので,早急にご回答宜しくお願い致します! 以下、はさみうちのプログラム↓ #include<stdio.h> #include<math.h> /*初期値x0,*/ /*f(x)を定義*/ double f(double x){ return sqrt(x*x+10.0) - 10.0*exp(-x*x); } /*はさみうち法の関数*/ double hasamiuchi(double x0,double x1,double eps,double imax){ double x2; /*x軸との交点*/ int i; /*繰り返しの回数*/ if(f(x0)*f(x1)>0){/*x0とx1が同符号の場合x1をx0とする*/ x0=x1; } for(i=0;i<imax;i++){ x2=(x1*f(x0)-x0*f(x1))/(f(x0)-f(x1)); /*x0とx1で出来る直線とx軸の交点x2を求める*/ x1=x2; /*x2の値を次のループにおけるx1とする*/ } if(fabs(x1-x0)<eps) return x2; /*収束したら解x2を返す*/ return 0.0/0.0; /*収束しなかったらnanを返す*/ } int main(void){ printf("ans = %f\n", hasamiuchi(2.0,1.0,1e-6,20));/*値を代入してはさみうちの実行*/ return 0; }

  • オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法のC言語プログラムに

    オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法のC言語プログラムについて教えてください! 課題なのですが、まったくわからず困ってます>< 1 常微分方程式 dy/dx=f(x,y),y(0)=1 の数値解をオイラー法を用いて計算するプログラムを作為せよ。ただし、f(x,y)=3-6x^2-4x+2xyとする。 2 α=1,β=1,γ=1/2,σ=1/2 の場合の2次ルンゲクッタ法を考える。1と同じ常微分方程式(f(x,y)も同じ)を考え、その数値解を求めるプログラムを作成せよ。また、オイラー法と2次ルンゲクッタ法の実行結果を示して、2つの近似精度を比較せよ。 3 1と同じ常微分方程式(f(x,y)も同じ)を考え、その数値解を4次ルンゲクッタ法を使って求めるプログラムを作成せよ。また、オイラー法、2次ルンゲクッタ法、4次ルンゲクッタ法の実行結果を示して、3つの近似精度を比較せよ。 以上の3つです。 休んでいた自分が悪いのですが、ネットで調べてもよくわからなくて… わかる方、よろしくおねがいします…

  • 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になってからは単調増加である という条件がさらに加わった場合どうなるかについてもご解答いただけると助かります。

  • はさみうち法‐2

    F(T)=6.72*10^-4*(1000-T)-5.67*10^-8*0.5*(T^4-600^4) をCでのはさみうち法のプログラムを教えてください 過去のQ&Aを検索してもでてこなかったのでできればソースを教えてください。

  • 数値解析の補間公式の問題

    Xの方程式X-9*(-X)=0は区間[0,1]に解を持つことがわかっている。f(X)=X-9*(-X)として、標本点X0=0,X1=0.5,X2=1における高々2次のfの補間多項式pを求めて、p(X)=0を満たすXを方程式の近似解として求める問題です。疑問点1;補間多項式を求める時にどの補間公式を使うのか?(Lagrangeなど)疑問点2;近似解とは?アドバイスお願いします(泣)

  • tan の近似法について

    タンジェントの計算を使用としているのですが,うまく計算できません. f(x)=arctan((a/b)*tan(x))-x ・・・(1) a,b:定数でa/b≒1, -π/2<x<π/2  の計算なのですが,数値計算だとあくまでグラフにしたときの見た目ですが f(x)=k(a-b)*sin(2*x)  ・・・(2) k:定数 のようになります. フーリエ級数等を用いて"近似の計算"をして式(2)のように2倍周期の関数にしたいのですが,うまく計算ができません. どなたか計算できませんか? 実際には計算で使用しているa,bはa>bでa/bは1.01位です.

  • 偏微分方程式の数値解法

    偏微分方程式の込み入った質問です。 2次元(x,y)の空間で2つの関数f(x,y),g(x,y)を考えます。 そこで、それぞれにラプラス方程式を立てました。 fxx+fyy = 0  (1) gxx+gyy = 0 (2) です。これは境界値問題で、差分式からSOR法を使って収束計算によって数値解を求めることができます。f, gはそれぞれ独立という形にはなります。 そこにもう1つ式が出てきました。 fxfy + gxgy = 0 (3) というものです。f,gをx,yで1回微分してできる式です。 都合3つの式が出てきました。 この数値解を求めるにはどのような方法があるでしょうか。 数値解ですから近似解です。 3つ目の拘束条件の下でのラプラス方程式とみると、ペナルティ関数とかラグランジュの未定係数法とかいろいろあるかもなと思いますが。 3つ目の式は完全に満たすというより、できるだけ満足するようにしたいというものです。 よろしくお願いします。

  • 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 以上です。 ご回答よろしくお願いいたします。

  • 数値解析法

    このHeun法のプログラムをRunge-Kutta法にするにはどうしたらいいですか? #include <stdio.h> #include <math.h> double f1(double y) { return y; } double f2(double y) { return -4*y; } int main(){ double a=0; double b; int m=10; int n; double h; double x,y; int k; double e; double f; double k1,k2; printf("Heun法計算例:y=e^x, y=1/e^4x\n\n"); // y = e^x b = 1; for(n=100;n<=10000;n*=100){ h = (b-a)/n; printf("y' = y: h(=dx) = %.1e (y=e^x)\n",h); x = a; y = 1; for(k=0;k<=n;k++) { x = k*h; if(k%(n/m)==0) { f = exp(x); e = fabs(y-f); printf("x=%.2f, y=%f, e^x=%f er=%.0e\n",x,y,f,e); } // Heun's method k1 = h*f1(y); k2 = h*f1(y+k1); y += (k1+k2)/2; } }

  • 数値解析の問題

    質問させていただきます 次の積分の数値積分を考える I=∫[B→A] f(x)dx [A.B}をn分割して、xの分点をとる、即ち xi=A+ih i=0,1,・・・n h=(B-A)/n n=6の場合、台形公式とシンプソンの1/3公式より Iの近似値を求めよ 但し、xi, fi=f(xi), hを用いてあらわせ 台形公式 I=h(f0+f2n)+2h{(f2+f4+・・・・f(2n-2)} シンプソンの公式 I=h/3{f0+f2n+2(f2+f4+・・・・・+f(2n-2)+4(f1+f3++・・・+f(2n-1)} 公式そのまま書いてみたのですが、あってるかどうか分かりません・・・ xiとかも使ってないし・・・ 詳しいかた回答お願いします