愚かに複雑なパラメトリック非線形方程式をreduce / solveなどで解くための最良の方法
文字通り悪夢であるパラメトリック非線形関数があります。私は根が存在することを知っています、それらは本物であり、2つのパラメーターp,e
は両方とも正です。私が数学に期待していたのは、解決策(ルートの形で、閉じた形ではない)を取得することでしたが、プログラムを一晩中動作させることさえ、私は降伏しました。効率的な方法で問題をフレーミングしていないのか、深刻なアップグレードが必要なのは私のPCなのか、ReduceやSolveなどの方法では難しすぎる問題なのか理解できません。後者の場合、私は運命にあると思います...他の2つへのヒントはありますか?助けてくれてありがとう。
私の試みと方程式:
f[x_]:=(1/(8 (p^2+x^2)^3))p^2 (-2 p^6+p^5 (4-8 x)+2 p^3 (3-8 x) x^2-6 p x^4+p^4 (80000+2 x-9 x^2)+2 p^2 x (40000+60000 x+x^2-5 x^3)-3 x^3 (-80000+40000 x+x^3)+(4 Sqrt[10] e x (p^2+x^2)^2 (2 p x^3+p^4 (-2+3 x)+2 p^3 x (-3+4 x)+x^2 (-80000+40000 x+x^3)+2 p^2 (40000-60000 x-x^2+2 x^3)))/Sqrt[-e p^2 (-1+x) x^2 (p^2+x^2)^2 (-40000+p^2+2 p x+x^2)])
Reduce[f[x]==0 && x>=0 &&p>=0 && e>=0,x,Reals] (*stuck running*)
Solve[f[x]==0 && x>=0 &&p>=0 && e>=0,x,Reals] (*stuck running*)
回答
おおよその答えに満足している場合は、を使用してみてくださいNDSolveValue。あなたの機能:
f[x_] := (1/(8 (p^2+x^2)^3))p^2 (-2 p^6+p^5 (4-8 x)+2 p^3 (3-8 x) x^2-6 p x^4+p^4 (80000+2 x-9 x^2)+2 p^2 x (40000+60000 x+x^2-5 x^3)-3 x^3 (-80000+40000 x+x^3)+(4 Sqrt[10] e x (p^2+x^2)^2 (2 p x^3+p^4 (-2+3 x)+2 p^3 x (-3+4 x)+x^2 (-80000+40000 x+x^3)+2 p^2 (40000-60000 x-x^2+2 x^3)))/Sqrt[-e p^2 (-1+x) x^2 (p^2+x^2)^2 (-40000+p^2+2 p x+x^2)])
を使用するNDSolveValueには、境界条件を知る必要があります。例えば、ここでの値だx
ときp
ですが1
。
x1 = x /. Block[{p=1}, First @ Solve[f[x] == 0, x]]
ルート[256006399839996+ 1023948800640 e +(255942399200020-3071999998080 e)#1 +(511955203840004 + 2304217598880 e)#1 ^ 2 +(1279846402079976-2048025605760 e)#1 ^ 3 +(-960279984200093 + 1024166395840 e)#1 ^ 4 + (192129617159615 + 4095897593600 e)#1 ^ 5 +(-384151995680463-512486397600 e)#1 ^ 6 +(-3455678391520375 + 2047846414080 e)#1 ^ 7 +(2880427177039798-332788480 e)#1 ^ 8 +(-576225624399594- 1024102385280 e)#1 ^ 9 +(43199520578 + 256064008800 e)#1 ^ 10 +(-14402879738-25598080 e)#1 ^ 11 +(-359829 + 12802240 e)#1 ^ 12 + 360087#1 ^ 13 +( 9 + 160 e)#1 ^ 14 + 9#1 ^ 15&、1]
今、私たちは使用することができますNDSolveValue:
sol = NDSolveValue[
{
D[f[x[p,e]]==0, p], x[1, e] == x1},
x,
{p,.1,100},
{e,.1,10000},
MaxStepFraction->.0005,
PrecisionGoal->10
]; //AbsoluteTiming
{19.2292、Null}
いくつかのランダムサンプルを確認してください。
Block[{p = 50, e = 200}, f[sol[p, e]]]
Block[{p = 10, e = 2000}, f[sol[p, e]]]
6.42413 * 10 ^ -9
8.0893 * 10 ^ -9
視覚化:
Plot3D[sol[p,e], {p,.1,100}, {e,.1,10000}]

FWIW、ここに半分の解決策があります:分子を取り、それが多項式になるようにそれを合理化し、そして根を見つけます。何をするために残っていることはポジティブなものを選択することであるp
とe
肯定しているが。(それがすべてで行うことができる場合)、このステップでは、具体的な数値がに与えられている場合を除き、時間に沿ってかかるp
とe
。
num = Simplify[ff, x >= 0 && p >= 0 && e >= 0] // Together //
Numerator // Simplify[#, x >= 0 && p >= 0 && e >= 0] & //
FactorList // #[[-1, 1]] & // Simplify
(* p Sqrt[-e (-1 + x) (-40000 + p^2 + 2 p x + x^2)] (2 p^6 + 6 p x^4 + p^5 (-4 + 8 x) + 2 p^3 x^2 (-3 + 8 x) + p^4 (-80000 - 2 x + 9 x^2) + 3 x^3 (-80000 + 40000 x + x^3) + 2 p^2 x (-40000 - 60000 x - x^2 + 5 x^3)) - 4 Sqrt[10] e (2 p x^5 + 4 p^3 x^3 (-1 + 2 x) + p^6 (-2 + 3 x) + 2 p^5 x (-3 + 4 x) + p^2 x^3 (-80000 - 2 x + 5 x^2) + x^4 (-80000 + 40000 x + x^3) + p^4 (80000 - 120000 x - 4 x^2 + 7 x^3)) *)
2つの用語があることを確認してください(最初の用語には明らかに部首が含まれています)。
Length@num
(* 2 *)
rat = num*MapAt[-# &, num, 1] // Expand // Simplify
(* e (p^2 (-1 + x) (-40000 + p^2 + 2 p x + x^2) (2 p^6 + 6 p x^4 + p^5 (-4 + 8 x) + 2 p^3 x^2 (-3 + 8 x) + p^4 (-80000 - 2 x + 9 x^2) + 3 x^3 (-80000 + 40000 x + x^3) + 2 p^2 x (-40000 - 60000 x - x^2 + 5 x^3))^2 + 160 e (2 p x^5 + 4 p^3 x^3 (-1 + 2 x) + p^6 (-2 + 3 x) + 2 p^5 x (-3 + 4 x) + p^2 x^3 (-80000 - 2 x + 5 x^2) + x^4 (-80000 + 40000 x + x^3) + p^4 (80000 - 120000 x - 4 x^2 + 7 x^3))^2) *)
Solve[rat == 0, x]
(* <15 Root objects> *)
これらの根には無関係な解が含まれており、それらを使用するには、パラメーターを数値に置き換える必要があるようです。このようなアプローチが役立つ場合は、パラメータを代入f[x]
して、結果の方程式を処理するf[x] == 0
方がよい場合があります。