JScriptの問題!割線法でf(x)=cos(x)-x^2=0の解を求める方法

このQ&Aのポイント
  • JScriptの問題で、f(x)=cos(x)-x^2=0の解を割線法で求める方法について添削をお願いします。
  • 初期値 x1=1, x2=0.5 を使用して、割線法を適用します。
  • 割線法の公式 X_(n+1)=X_n-{(X_n-X_(n-1))/(f(X_n)-f(X_(n-1))} * f(X_n) を使用します。
回答を見る
  • ベストアンサー

JScriptの問題です。添削お願いします。【至急!】

f(x)=cos(x)-x^2=0の解を割線法により求めよ、という問題です。 初期値はx1=1,x2=0.5です。 以下は自分で解答を作りました。 自分で怪しいと思うところはわかるのですが、それをどう正せばいいかわかりません。 添削お願い致します。 割線法の公式は、 X_(n+1)=X_n-{(X_n-X_(n-1))/(f(X_n)-f(X_(n-1))}*f(X_n) として考えました。 var e=0.001 , x1=1.0 , x2=0.5 , N=27; function f(x){return Math.cos(x)-x*x;} WScript.Echo("割線法:\n"+SplitLine(N,e,x1,x2)); function SplitLine(N,e,x1,x2){ var x=x1,x2,xn,str=""; for(var i=1; i<N; i++){ str+=(i+1)+" "+x+"\n"; xn=x-((x-(x-1))/(f(x)-f(x-1)))*f(x); //←ここが違うのでしょうか? if(Math.abs((xn-x)/x)<e) break; x=xn; } return str; }

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

SplitLineの引数のx1とx2の扱いが逆ではありませんか 割線法の公式を X_(n+1)=X_n-{(X_n-X_(n-1))/(f(X_n)-f(X_(n-1))}*f(X_n) 考えたのであれば 最初はX_nがx2、X_(n-1)がx1であると考えます 次回は 初回の答えがX_n、X_(n-1)がx2となります つまり関数の中身は function SplitLine(N,e,x1,x2){   var Xn0=x2, Xn1=x1, Xn, str="";   str = "x1 1.0\n" + "x2 0.5\n"   for(var i=3; i<N; i++){    // 元の式と見比べてみましょう    //xn = x- ((x -(x-1)) /(f(x) -f(x-1)))*f(x);     Xn = Xn0-((Xn0-(Xn1-1))/(f(Xn0)-f(Xn1)))*f(Xn0);     if(Math.abs((xn-x)/x)<e) break;     str += "X" + i + " " + Xn + "\n";     // 前回の n0項を n1項に代入     Xn1 = Xn0;     // n0項に計算結果代入     Xn0 = Xn;   }   return str; } といった具合になるかと ・・・

mina37_sjt
質問者

お礼

参考になりました。 少し書き直す必要があったのですが、自分のプログラムも完成いたしました。 勉強頑張ります。 ありがとうございました。

その他の回答 (1)

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.2

変数名をx1, x2, xnとするとプログラムにしたとき混同しそうなので、変数名を変えて割線法のアルゴリズムを書き直してみました。 なお、Nは初期値が近似値から遠い場合に途中で処理を終わらせるために使用されていると思いますが、書き直したものでは使用していません。 do ... while ()構文で差がイプシロン(e)より小さくなるまでひたすら計算します。 ---------- var e = 0.001; function f(x) { return Math.cos(x) - x * x; } function secant(oldValue, newValue) { if (Math.abs(oldValue - newValue) < e) { return newValue; } do { var tmpValue = oldValue; oldValue = newValue; newValue = oldValue - (oldValue - tmpValue) / (f(oldValue) - f(tmpValue)) * f(oldValue); } while (Math.abs(oldValue - newValue) > e); return newValue; } ---------- 上記で関数secantに初期値を与えれば結果が返るはずです。

関連するQ&A

  • 大学1年レベルの関数列に関する問題です

    f_n(x)=xn・e^(-xn^2)のとき、[0,1]上でf_nは各点収束するか、一様収束するか?という問題なのですが、私は ロピタルの定理より、各x∈Iに対して、|xn・e^(-xn^2)|→0(n→∞)を得るのでf(x)=0に各点収束する。 また、ある正の数εがあって、sup(f_n(x)-f(x))=1/e>ε(n→∞)より0に一様収束しない。 結局f_n(x)はf(x)=0に各点収束。 としました。しかし lim∫[0,1]f_n(x)=∫[0,1]f(x)=0となりました・・・※ そこで思ったのですが、 f_nがfに[0,1]上一様収束ならば※が成り立つのは明らかですが、各点収束でもなりたつことはあるのでしょうか?もしないのなら上の解答が間違ってることになりますよね・・ どなたか回答よろしくお願いします。

  • この問題が解けません。

    この問題が解けません。 数字1、2、3、…、Fが1つずつ合計F枚入っている箱から、元に戻さずに1枚ずつN枚のカードを引く試行を考える。 ここで、2≦N≦Fとし、引いたカードの順に、書かれている数字をx1,x2,x3,…,xNとする。 (問)x1<x2<x3<………xN、すなわち、N枚のカードを小さい順に引く確率Yを求めよ。 どのように回答が出せば良いのでしょうか。

  • 期待値?平均?意味不明!

    統計の勉強をしていて????な内容に出くわし困惑しております。どなたかお知恵をお貸しください。 E(a1X1+a2X2+.....+anXn)=a1E(X1)+a2E(X2)+...+anE(Xn)・・・・(1) X1,X2,....,Xnが独立ですべて期待値μ、分散σ^2の同一分布に従い"a1=a2=...=an=1/n"の時 E(X1)=E(X2)=....=E(Xn)=μ E(X1/n+X2/n+....+Xn/n)=μ/n+μ/n+...+μ/n=μ X~=(X1+x2+....+Xn)/nとすると E(X~)=μ これまではいいんですが後に (1)の性質で"X1,X2,.....,Xn"が独立でどれも平均μとすると E(X~)=E(X1/n+X2/n+....+Xn/n) =E(X1)/n+E(X2)/n+...+E(Xn)/n =μ/n+μ/n+.....μ/n=μ と書いてありました。 μっていったい期待値なんでしょうか?平均なんでしょうか?それともどちらでもこのE(X~)=μは成立するのでしょうか? μが平均の場合はなぜE(Xk)=μ(kは第k項の意味です)とできるのか理由も付けて教えてください。 読みにくくてすみませんがよろしくお願いします。

  • ニュートン法

    ケプラー方程式x-e*sin(x)-c=0の解をステップ数とともに出力するプログラムで、e,cはそれぞれ0.5と1です。 xに値を入力して計算させるのですが、どうしてもできません。 下のプログラムリストでおかしいところはどこでしょうか? // ニュートン法 x-e*sin(x)-c=0 #include <stdio.h> #include <math.h> #define e 0.5 #define c 1.0 #define K 10000 double fun(double x); double bibun(int i,double x); float m=1.0,n=1.0; int i=1; main(){ float x1,x2; float z; printf("初期値x0を入力して下さい\n"); scanf("%f",&x1); for(i=0;i<=K;i++){ x2 = x1 - fun(x1)/bibun(i,x1); x1 = x2; z = fun(x1); z = fabs(z); if(fabs(z)<=0.00001){ break; } if(i==K){ printf("収束しません\n"); exit(0); }    } printf("解 = %f\n",x1); printf("ステップ数 = %d",i); return 0; } // 関数f(x) double fun(double x1){ double r; r = x1 - e * sin(x1) - c; return r; } // 微分 double bibun(int i,double x1){ float p; if(i%2==1){ p = pow((-1.0),m)*e*sin(x1); m++; } else { p = pow((-1.0),n)*e*cos(x1); n++; } return p; }

  • ニュートン法を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; } }

  • 微積分の証明問題についての質問です。

    微積分の証明問題についての質問です。 xの2乗をx^{2}のように表しています。 f:R^{n} → R , p∈R とする。 fが微分可能のとき、次の(1),(2)が同値であることを示せ。 (1)任意のα>0 と(x1,x2,…,xn)∈R^{n} に対して、 f(αx1,αx2,…,αxn) = α^{p}f(x1,x2,…,xn) …(※) (2)任意の(x1,x2,…,xn)∈R^{n}に対して、 Σ[k=1,n]xk{∂f(x1,x2,…,xn)/∂xk} = pf(x1,x2,…,xn) …(♯) ヒントとして、 ・(1)⇒(2) (※)の両辺をαで微分して、α=1とおく。 ・(2)⇒(1) F(x1,x2,…,xn,α) := α^{-p}f(αx1,αx2,…,αxn) を考えて、 ∂F(x1,x2,…,xn,α)/∂α = 0 を示せ。 が与えられています。アドバイスお願いします。

  • 次の確率分布の問題の解答解説をお願いします。

    ・X1,X2,…,Xnが独立にExp(λ)に従うとき,X1+X2+…+Xnの密度関数fn(x)は次の式で与えられることを帰納法で示せ。 fn(x)= 0(x=<0) (λ^n)*(x^(n-1))*(e^(-λx))/((n-1)!) (x>0)

  • 以下の不等式の証明を少し頭使いながらやってみました。

    以下の不等式の証明を少し頭使いながらやってみました。 n,kを正の整数、x1,x2,・・・・,xnを正の実数とする。このとき  x1^k+x2^k+・・・・+xn^k≧((x1+・・・+xn)^k)/n^(k-1) ・・・・・(#) が成立することを示せ。 (説明)普通は数学的帰納法で示す(模範回答で確認済み)が、ここでは少し見方を変えて示す。 まずk=1のとき (#)の右辺,左辺ともにx1+・・・・+xnで等号成立する。 以降k≧2とする。 まずx1=・・・・・=xn=aのとき (#)の右辺,左辺ともにna^kで等号成立する。 次に0<x1<x2≦x3≦・・・・・≦xnとする。 (#)の両辺に1/nをかけて   (x1^k+x2^k+・・・・+xn^k)/n≧((x1+・・・+xn)/n)^k ・・・・・(##) を示す。 ここでx1,・・・,xnの平均xa=(x1+・・・+xn)/nとし、区間[x1,xn]内で任意にx2,x3,・・・ ・,x(n-1)を(x1,xnを先に定めて)プロットする。そして f(x)=x^k (k≧2)について考える。またx1<xa≦xnである。 g(x)を(xa,f(xa))についての接線の方程式とすれば f(xa)=(g(x1)+g(x2)+・・・・・+g(xn))/n である。 さらにf(x)は区間[x1,xn]において下に凸だから f(x1)>g(x1),f(x2)≧g(x2),・・・,f(xn)≧g(xn) が成り立つ。 したがって (f(x1)+・・・・+f(xn))/n >(g(x1)+g(x2)+・・・・・+g(xn))/n=f(xa) となる。 よってxa=(x1+・・・+xn)/n ,f(x)=x^k から (##)が言えて、(#)が以上から成り立つことが言えた。 模範解答にもこの方法は載っておらず、独自で思いついて示しました。この証明方法でも良いですか? ここのポイントはy=f(x)=x^kと(xa,f(xa))についての接線の方程式を考えればうまく応用できるというところです。問題は間違っていないかどうかですが自分でも面白く感動しました。

  • 数学の問題がどうしても解けません。。。

    数学の問題がどうしても解けません。。。 どなたか教えてください 1、 f"(x)が常に正なるところでは  1/n{f(x1)+f(x2)+f(x3)+・・・+f(xn)}?f(x1+x2+x3+・・・+xn/n) なることを証明せよ。ただし、符号は x1=x2=x3=・・・=xn のときに限る。 2、 定積分の値を求めよ ∫[0~2π] 1/a+cosx dx (a>1)

  • 確率変数

    明日試験ですので、ぜひお願いします。 確率変数X1,X2,...Xnは互いに独立で、分布は P(Xi=x)=|x|/12    x=-1,1,-2,2,-3,3 に従うとする。このとき lim 1/(n*n)E{f(X1+X2+...+Xn)}(nが無限大のとき)を求めよ。 ただし、f(x)=x^4   (x>=0)        x^2   (x<0) とする。

専門家に質問してみよう