Cách tốt nhất để giải phương trình phi tuyến tính tham số phức tạp một cách ngu ngốc với rút gọn / giải quyết, v.v.

Aug 16 2020

Tôi có một hàm phi tuyến tính tham số, đó là một cơn ác mộng. Tôi biết rễ tồn tại, chúng có thật và hai thông số, p,eđều dương. Những gì tôi đã mong đợi từ toán học là để có được một giải pháp (ở dạng gốc, không có dạng đóng) nhưng thậm chí để chương trình hoạt động cả đêm tôi đã đầu hàng. Tôi không hiểu có phải do tôi định khung vấn đề không theo cách hiệu quả hay không, đó là máy tính của tôi cần nâng cấp nghiêm trọng hoặc vấn đề chỉ đơn giản là quá khó đối với các phương pháp như Giảm hoặc Giải. Nếu trường hợp sau là trường hợp sau, tôi đoán tôi sẽ chết ... Có gợi ý nào cho hai người kia không? Cảm ơn đã giúp đỡ.

Những nỗ lực của tôi và phương trình:

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*)

Trả lời

2 CarlWoll Aug 18 2020 at 04:31

Nếu bạn hài lòng với một câu trả lời gần đúng, thì bạn có thể thử sử dụng NDSolveValue. Chức năng của bạn:

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)])

Để sử dụng NDSolveValue, chúng ta cần biết một điều kiện biên. Ví dụ, đây là giá trị của xkhi p1:

x1 = x /. Block[{p=1}, First @ Solve[f[x] == 0, x]]

Gốc [256006399839996 + 1023948800640 e + (255942399200020 - 3071999998080 e) # 1 + (511955203840004 + 2304217598880 e) # 1 ^ 2 + (1279846402079976 - 2048025605760 e) # 1 ^ 3 + (-995840 + 102499162 ^ 3 + (-96093 + 102499162) (192129617159615 + 4095897593600 e) # 1 ^ 5 + (-384151995680463 - 512486397600 e) # 1 ^ 6 + (-3455678391520375 + 2047846414080 e) # 1 ^ 7 + (2880427177039798 - 332762480 e3 -99594 ^ 8 - 332762480 e3 -99594 ^ 8 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]

Bây giờ, chúng ta có thể sử dụng 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}

Kiểm tra một số mẫu ngẫu nhiên:

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

Hình dung:

Plot3D[sol[p,e], {p,.1,100}, {e,.1,10000}]

2 MichaelE2 Aug 17 2020 at 04:15

FWIW, đây là một nửa giải pháp: Lấy tử số, hợp lý hóa nó để nó là một đa thức, và tìm nghiệm nguyên. Việc còn lại cần làm là chọn những thứ tích cực khi petích cực. Bước này cần nhiều thời gian (nếu có thể thực hiện được), ngoại trừ khi các giá trị số cụ thể được cấp cho pe.

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))
*)

Kiểm tra xem có hai thuật ngữ (rõ ràng đầu tiên chứa căn):

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> *)

Những gốc này chứa các giải pháp không liên quan và dường như người ta cần thay thế các giá trị số để các tham số hoạt động với chúng. Nếu cách tiếp cận như vậy hữu ích, thì có lẽ việc thay thế các tham số trong f[x]và xử lý phương trình kết quả f[x] == 0có thể tốt hơn.