วิธีที่ดีที่สุดในการแก้สมการเชิงเส้นเชิงพาราเมตริกที่ซับซ้อนอย่างโง่เขลาด้วยการลด / แก้ ฯลฯ

Aug 16 2020

ฉันมีฟังก์ชันไม่เชิงเส้นแบบพาราเมตริกซึ่งเป็นฝันร้ายอย่างแท้จริง ฉันรู้ว่ารากมีอยู่พวกมันเป็นของจริงและพารามิเตอร์p,eทั้งสองเป็นค่าบวก สิ่งที่ฉันคาดหวังจาก mathematica คือการได้รับโซลูชัน (ในรูปแบบของรูทไม่มีรูปแบบปิด) แต่ถึงแม้จะปล่อยให้โปรแกรมทำงานตลอดทั้งคืนฉันก็ยอมจำนน ฉันไม่เข้าใจว่าฉันกำลังวางกรอบปัญหาไม่ได้อย่างมีประสิทธิภาพเป็นพีซีของฉันที่ต้องการการอัปเกรดอย่างจริงจังหรือปัญหาที่ยากเกินไปสำหรับวิธีการเช่นลดหรือแก้ไข ถ้าเป็นอย่างหลังฉันเดาว่าฉันถึงวาระ ... มีคำใบ้ต่ออีกสองคนไหม? ขอบคุณสำหรับความช่วยเหลือ

ความพยายามและสมการของฉัน:

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

คำตอบ

2 CarlWoll Aug 18 2020 at 04:31

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เราจำเป็นต้องทราบเงื่อนไขขอบเขต ตัวอย่างเช่นนี่คือค่าของxwhen pis 1:

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

รูท [256006399839996 + 1023948800640 e + (255942399200020 - 3071999998080 จ) # 1 + (511955203840004 + 2304217598880 จ) # 1 ^ 2 + (1279846402079976 - 2048025605760 e) # 1 ^ 3 + (-960279984200093 + 1024) (192129617159615 + 4095897593600 จ) # 1 ^ 5 + (-384151995680463 - 512486397600 จ) # 1 ^ 6 + (-3455678391520375 + 2047846414080 จ) # 1 ^ 7 + (2880427177039798 - 332788480 +3) # 157 ^ 762 - 2462-2594 1024102385280 จ) # 1 ^ 9 + (43199520578 + 256064008800 จ) # 1 ^ 10 + (-14402879738 - 25598080 จ) # 1 ^ 11 + (-359829 + 12802240 จ) # 1 ^ 12 + 360087 # 1 ^ 13 + ( 9 + 160 จ) # 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}]

2 MichaelE2 Aug 17 2020 at 04:15

FWIW นี่คือวิธีแก้ปัญหาครึ่งหนึ่ง: หาตัวเศษหาเหตุผลให้มันเป็นพหุนามแล้วหาราก สิ่งที่เหลืออยู่ที่จะทำคือการเลือกคนที่เป็นบวกเมื่อpและeเป็นบวก ขั้นตอนนี้ต้องใช้เวลาตาม (ถ้ามันสามารถทำได้เลย) ยกเว้นเมื่อค่าตัวเลขที่เฉพาะเจาะจงจะได้รับและ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))
*)

ตรวจสอบว่ามีสองคำ (คำแรกที่มีรากศัพท์ชัดเจน):

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อาจจะดีกว่า