• ベストアンサー

繰り返し計算で求められる解を直接計算して求める方法

こんにちは、 下記について、教えて下さい。 y=625.733*((2/5)*(1-x)*a2^2-(4/105)*(1+2*x)*a2^3); があります。 a2は a2->-((7*(-1+x))/(1+2*x))-s1; です。 s1は nが1のときは、s1=0 nが2以上のときは、s1=(92*n)/(y*10^6) となります。 nを増やして、yが5.9に一番、近づいたときの nを求めたいのですが、どのように計算すれば 良いでしょうか? 下記は、nを増やして、mathematcaを使用して数値計算で求めたものです。 答えは n=13822 y=5.89997 となりました。 もっと、スマートに直接計算する方法を教えて下さい。 x=0.767476; For[n=1,n<2*10^4,n++, If[n==1,s1=0]; If[n>1,s1=(92*n)/(y1*10^6)]; y=625.733*((2/5)*(1-x)*a2^2-(4/105)*(1+2*x)*a2^3); y1=y/.a2->-((7*(-1+x))/(1+2*x))-s1; If[y1-5.9<0,Print["n=",n]]; If[y1-5.9<0,Print["y1=",y]]; ];

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

  • ベストアンサー
  • inara
  • ベストアンサー率72% (293/404)
回答No.3

>この解を求める式は、..で良いのでしょうか? はい。変数が3つ(x, y, n)ですが、これを n について解けばいいわけです。Mapleの場合 solve(式,n) で n= という文字式の解が3つ出ました(非常に複雑な式です)。数値解を出すのであれば、Mapleの場合は、solve(f(xの値、yの値,n)=0,n) で複素数解が出ます。文字式の解を使えば、Excelのマクロでも計算できると思ったのでその方法を紹介しましたが、Mathematicaならダイレクトに数値解を出してもいいと思います。

noname#107097
質問者

お礼

失礼しました。mathematica下記で求まりました。 x=0.767476; z=Solve[y-(625.733*((2/5)*(1-x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^2-(4/105)*(1+2*x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^3))==0,n]; y=5.9 Simplify[z]

noname#107097
質問者

補足

お返事ありがとうございます。 お陰さまで、何か、少し見えて来ました。

その他の回答 (2)

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.2

最終的に (1) >y=625.733*((2/5)*(1-x)*a2^2-(4/105)*(1+2*x)*a2^3)…(A) この式でy=5.9となる(x,a)の組を a2=-7*(-1+x)/(1+2*x) の条件で求めることではないですか? それとも (2) >x=0.767476,a(n)=-7*(-1+x)/(1+2*x)-Δa(n-1) で補正しながら、y≒5.9となるnを求めるのが最終的な目的ですか? 最終的な目的は(x,a)を求めるのが目的なら (1)の直接計算法がいいと思いますが如何でしょうか? そうなら、y=5.9とおいて (x,a)=(0.9295680961,0.1724378604),(0.6232131823,1.174090442), (0.06487241295,5.794134179),(1.062808134,-0.1406624814) という組が求まります。 意図が違っていたら無視して下さい。

noname#107097
質問者

補足

再度、自分で考えてみます。 お返事ありがとうございました。

  • inara
  • ベストアンサー率72% (293/404)
回答No.1

Mathematica を持ってないので Maple でやってみました。 問題の式を、x, y, n の関数として f:= (x,y,n)-> y-(625.733*((2/5)*(1-x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^2-(4/105)*(1+2*x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^3)); で定義して、f( 0.767476,5.9,n)=0 の解 n を求めると n=13820.40245、59148.69709 となりました。n が整数なら解に最も近いのは n=13820です。 n が大きい場合、繰り返し法だと解が見つかるかどうか分からないですね。関数 f (x,y,n) は n に関する3次式なので f (x,y,n) = 0 の複素数解 n は、x と y を文字変数としたままで解けるはずです(Mapleではちゃんと出ました)。この3つの解のうち複素解を除外した実数解を抜き出して(0個~3個)、その両側の整数を f (x,y,n) に代入して 0 に最も近いものを解とするプログラムが良いのではないでしょうか。解の式は大変複雑で長いプログラムとなりますが、繰り返し計算でないので、計算可能な数値範囲内であれば確実に解が求められます。なお、x=-1/2 または y =0 のとき分母=0となるので、プログラムの最初で除外したほうがいいでしょう。

noname#107097
質問者

補足

お返事ありがとうございます。 わざわざ、mapleで計算して頂きまして、ありがとうございます。 >f( 0.767476,5.9,n)=0 の解 n を求めると n=13820.40245、59148.69709 となりました。 答えは、正しいです。 Mapleで計算が出来たのなら、多分、mathematicaでも出来そうですね。 しかし、下記を実行しますと、yが残ってしまい、ちゃんと計算できません。 どうしてでしょうか? x=0.767476; z=Solve[y-(625.733*((2/5)*(1-x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^2-(4/105)*(1+2*x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^3))-5.9Š0,n]; Simplify[z] この解を求める式は、 y-(625.733*((2/5)*(1-x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^2-(4/105)*(1+2*x)*(-((7*(-1+x))/(1+2*x))-(92*n)/(y*10^6))^3))-5.9=0 で良いのでしょうか?

関連するQ&A