NDSolve แก้ปัญหาผิด

Nov 21 2020

พิจารณา ODE $$\frac{y'y}{1+\frac{1}{2} \sqrt{1+ y'^2}}=-x.$$

การใช้

NDSolve[{-x==y'[x] y[x]/(1+Sqrt[1+(y'[x])^2]/2), y[0] ==3}, y, {x,-7,7}]

และการวางแผนนำไปสู่การแก้ปัญหาทั้งสอง (คำเตือนบางส่วนใกล้ขอบเขต)

$$y(x) = \sqrt{6^2 - x^2} - 3$$ และ $$y(x) = \sqrt{2^2 - x^2} + 1.$$

แต่วิธีหลังเท่านั้นที่เป็นทางออกที่ถูกต้อง! ไม่ว่าฉันจะลอง 'วิธีไหน' ก็มักจะมีวิธีแก้ปัญหาที่ผิดพลาดเสมอ ยกเว้นการใช้

Method -> {"EquationSimplification" -> "Residual"}

ทำไมถึงเป็นเช่นนั้น?

หมายเหตุ: ดังที่ระบุไว้ในคำตอบด้านล่างการแก้ไขค่าในx=0เป็นสิ่งสำคัญเนื่องจาก$y'$หายไปที่นี่ แต่การใช้ค่าเริ่มต้นอื่น ๆ เช่นy[Sqrt[3]]=2ปัญหาจะยิ่งแย่ลงเนื่องจากตอนนี้สาขาหนึ่งผิดไปหมดทุกที่และอีกสาขาหนึ่งถูกต้องในพื้นที่เล็ก ๆ เท่านั้น

คำตอบ

5 darksun Nov 22 2020 at 18:08

NDSolveเหตุผลสำหรับพฤติกรรมที่ดูเหมือนว่าจะเป็นปัญหาใหญ่ในเชิงตรรกะ ในระหว่างการคำนวณดูเหมือนว่าจะปฏิบัติต่อนิพจน์เช่น: y==Sqrt[x]และy^2==xเหมือนกัน แต่อย่างที่ผู้ใช้ทุกคนรู้ที่นี่ไม่ใช่!

เพื่อเป็นการยืนยันให้ใช้ตัวอย่างของคุณ: การคูณด้วยตัวส่วนให้ $$-x\left(1-\frac{1}{2} \sqrt{1+(y'(x))^2}\right)=y'(x) y(x).$$ กำลังสองทั้งสองข้างอย่างโง่เขลาและแก้ให้ $y'(x)$ สร้างสองสาขา

NDSolve[{y'[x]==(4 x y[x]+Sqrt[3 x^4 + 4 x^2 y[x]^2])/(x^2 - 4 y[x]^2) , y[0]==3}, y, {x,-6,6}]

และ

NDSolve[{y'[x]==(4 x y[x]-Sqrt[3 x^4 + 4 x^2 y[x]^2])/(x^2 - 4 y[x]^2) , y[0]==3}, y, {x,-6,6}]

เหล่านี้เป็นสาขาที่NDSolveมีให้แม้ว่าจะไม่มีสาขาใดที่ถูกต้อง

ยิ่งแย่ไปกว่านั้นแม้ว่าจะเป็นพื้นฐาน แต่ก็ไม่ได้ตรวจสอบแนวทางแก้ไข สิ่งนี้จะต้องใช้เพียงบรรทัดของโค้ดพิเศษในอัลกอริทึมเนื่องจากมันใช้ tuples อยู่แล้ว$(x_i,y(x_i),y'(x_i)$. เพียงแค่เสียบเข้าในสมการและตรวจสอบว่าจริงหรือเท็จ (มีข้อผิดพลาดเกี่ยวกับตัวเลข)

แก้ไข: ความต้องการที่จะเปลี่ยนสมชนิดบางส่วนของรูปแบบมาตรฐานซึ่งถูกควบคุมโดยNDSolve EquationSimplification: มีสามตัวเลือกที่เป็นไปได้สำหรับวิธีการนี้MassMatrix, ResidualและSolveซึ่งเป็นค่าเริ่มต้น หลังแปลงสมการให้อยู่ในรูปแบบที่ไม่มีอนุพันธ์ด้านใดด้านหนึ่ง จากนั้นระบบจะแก้ไขด้วยตัวแก้สมการเชิงอนุพันธ์ธรรมดา เมื่อResidualใดที่ถูกเลือกคำศัพท์ที่ไม่ใช่ศูนย์ทั้งหมดในสมการจะถูกย้ายไปที่ด้านใดด้านหนึ่งจากนั้นแก้ไขด้วยตัวแก้สมการพีชคณิตเชิงอนุพันธ์ นี่คือเหตุผลที่ผลลัพธ์ถูกต้องในกรณีนี้เนื่องจากไม่ได้ใช้Solveซึ่งเป็นจุดบกพร่องที่นี่

8 MichaelE2 Nov 21 2020 at 20:28

ปัญหาทั่วไป

ในการใช้NDSolveแก้ IVP ลำดับที่หนึ่งโดยทั่วไปมีสองวิธีในการตั้งค่า ODE:

y'[x] == f[x, y[x]]     (* explicit form *)
F[x, y[x], y'[x]] == 0  (* implicit form *)

ตัวแก้ตัวเลขส่วนใหญ่ต้องการให้ระบุปัญหาในรูปแบบที่ชัดเจน ในMathematicaมีตัวแก้เพียงตัวเดียวที่ทำงานกับรูปแบบนัยIDAและถูก จำกัด ไว้ที่ความแม่นยำของเครื่องจักร เนื่องจากง่ายต่อการแปลงรูปแบบโดยนัยเป็น ODE ลำดับที่สองอย่างชัดเจนโดยการแยกความแตกต่างด้วยความเคารพxอาจไม่มีแรงกดดันมากนักในการพัฒนาตัวแก้แบบนัย

ในMathematicaคุณสามารถขอให้ลองแก้ปัญหาในรูปแบบใดรูปแบบหนึ่งโดยใช้Methodตัวเลือก:

Method -> {"EquationSimplification" -> "Solve"}    (* explicit *)
Method -> {"EquationSimplification" -> "Residual"} (* implicit *)

ด้วย"Solve"วิธีการซึ่งเป็นค่าเริ่มต้นNDSolveเรียกSolveให้แปลง ODE เป็นรูปแบบที่ชัดเจน สมการที่กำหนดในรูปแบบนัยอาจมีหลายคำตอบและหากเป็นเช่นนั้นNDSolveจะรวมแต่ละคำตอบแยกกัน นั่นคือสิ่งที่เกิดขึ้นในตัวอย่างของ OP นอกจากนี้NDSolveยังได้รับการตั้งค่าเพื่อรวม ODE ในรูปแบบระเบิดแยกกันอย่างอิสระและไม่สามารถรวมเข้าด้วยกันได้ซึ่งเป็นสิ่งที่จำเป็นในกรณีของ OP (ดูคำตอบของ @BobHanlon )

ตอนนี้Solve's ปัญหาของgenericityมีบทบาทสำคัญที่นี่ ในกรณีของ OP จะส่งคืนโซลูชันที่แต่ละโดเมนใช้ได้ในบางโดเมนและไม่ถูกต้องในภูมิภาคอื่น ๆ ที่ไม่ว่างเปล่ารวมถึงที่เราต้องการผสานรวมด้วย Reduceมีความรอบคอบและวิเคราะห์ระบบของ OP มากขึ้น หนึ่งสามารถทำให้Solveการใช้งานReduceที่มีตัวเลือกแต่ก็ยังส่งกลับสองโซลูชั่นที่แยกต่างหากที่ถูกต้องในแต่ละด้านหนึ่งของMethod -> Reduce x == 0ต่อไปก็จะส่งกลับConditionalExpressionซึ่งNDSolveฉายาบน (และให้ "ไม่ใช่ตัวเลข" NDSolve::ndnumข้อผิดพลาดที่สภาวะเริ่มต้นในช่วงเฟส ) ได้รับการแนะนำค่อนข้างช้าใน V8 และอาจมีคำขอไม่เพียงพอที่จะจัดการกับ WRI ได้อย่างถูกต้องProcessEquationsConditionalExpressionNDSolve

OTOH "Residual"วิธีการแก้ ODE โดยปริยายในแต่ละขั้นตอน เนื่องจากโซลูชันทั้งสองใช้ได้พร้อมกันที่เดียวเท่านั้นx == 0จึงจะพบสาขาที่ถูกต้องเมื่อNDSolveก้าวไปข้างหน้า สิ่งนี้จะคำนวณวิธีแก้ปัญหาที่ถูกต้องซึ่ง OP กล่าวถึง ข้อเสียเปรียบเพียงอย่างเดียวคือมีวิธีการผสานรวมเพียงวิธีเดียวและเฉพาะในความแม่นยำของเครื่องจักรเท่านั้น

ดูเหมือนว่าจะเป็นเรื่องง่ายในNDSolve`ProcessEquationsขั้นตอนที่จะตรวจสอบว่า ODE รูปแบบโดยนัยดั้งเดิมเป็นที่พอใจโดยรูปแบบที่ชัดเจนในเงื่อนไขเริ่มต้น ที่จะไม่จับปัญหาในตัวอย่างที่y[0] == 3จุดที่ทั้งสองรูปแบบที่ชัดเจนตอบสนองความ ODE นัยรูปแบบ y[1] == 2แต่มันจะจับปัญหาที่ ปัญหาเกี่ยวกับการแก้ปัญหากลับมาอีกSolveก็คือว่าสูตรที่ชัดเจนสำหรับy'[x]ความต้องการที่จะสลับสาขาเพื่อแก้ปัญหาอื่น ๆ ที่ส่งกลับโดยเมื่อข้ามบูรณาการSolve x == 0การสลับสาขาไม่ใช่สิ่งที่NDSolveตั้งขึ้นเพื่อทำและดูเหมือนว่าฉันจะเป็นการแก้ไขการเขียนโปรแกรมที่ง่ายเนื่องจากแต่ละโซลูชันจะรวมกันอย่างอิสระ บางวิธีในการดำเนินการนี้มีให้ด้านล่างนี้ แต่ทั้งหมดนี้ต้องให้ผู้ใช้เตรียมการNDSolveโทร ไม่มีการดำเนินการใด ๆ โดยอัตโนมัติNDSolveซึ่งเป็นที่ต้องการ

สุดท้ายผู้ใช้ควรคาดหวังอะไร? เป็นเวลานานในการคำนวณทางวิทยาศาสตร์ผู้ใช้คาดว่าจะตั้งค่าการรวมตัวเลขของสมการเชิงอนุพันธ์ ดูเหมือนว่าจะยังคงเป็นเช่นนั้นใน MATLAB และ NumPy ฉันไม่รู้จักเมเปิ้ลดีพอที่จะแสดงความคิดเห็น ปรัชญาทั่วไปของMathematicaคือการทำให้ทุกอย่างเป็นไปโดยอัตโนมัติให้มากที่สุด Mathematicaยังมีแนวโน้มที่จะใช้วิธีแก้ปัญหาที่แท้จริงโดยทั่วไปแทนที่จะเป็นข้อ จำกัด ที่เข้มงวดมากขึ้น สิ่งเหล่านี้ค่อนข้างขัดแย้งกันที่นี่เนื่องจากวิธีการทั่วไปSolveเป็นแหล่งที่มาของปัญหาในการNDSolveแก้ปัญหา ในทางกลับกันการที่จะให้ทุกอย่างเป็นไปโดยอัตโนมัตินั้นไม่ใช่เป้าหมายของ Wolfram ที่เป็นหลักการชี้นำมากนัก คำถาม & ตอบในไซต์นี้แสดงว่าAutomaticไม่สามารถทำให้งานสำเร็จได้เสมอไป ผู้ใช้มักจะต้องเข้าใจปัญหารู้ว่ามีตัวแก้อะไรบ้างเตรียมอินพุตตามนั้นและโทรหาผู้แก้ปัญหาด้วยตัวเลือกที่เหมาะสม สำหรับ IVP รูปแบบโดยนัยผู้ใช้ควรทราบว่าอาจมีปัญหาในการแก้ไขสำหรับy'[x]. นอกจากนี้ควรทราบด้วยว่ามีวิธีมาตรฐานในการจัดการกับ ODE แบบนัย:

  • ใช้ตัวแก้โดยนัยเช่น IDA เรียกว่าเมื่อ"Residual"ถูกเรียกใช้
  • สร้างความแตกต่างเพื่อเพิ่มคำสั่งซื้อ
  • การแก้สำหรับวิธีการy'[x]เริ่มต้นอย่างชัดเจน"Solve"

ฉันจะขอย้ำอีกครั้งว่าฉันคิดว่ามันสมเหตุสมผลที่จะคาดหวังที่NDSolveจะตรวจสอบว่ารูปแบบที่ชัดเจนนั้นตรงตาม ODE แบบนัยดั้งเดิมที่เงื่อนไขเริ่มต้น ในขณะที่ผู้ใช้สามารถตรวจสอบผลลัพธ์ของNDSolveafter fact แต่ในกรณีเช่น IVP y[1] == 2ก็จะป้องกันไม่ให้มีการผสานรวมภายนอก

ตัวอย่างของ OP

โซลูชันที่ชัดเจนสำหรับy'[x]เราสำหรับ ODE ของ OP มีสองสาขาสำหรับx < 0และสองสาขาสำหรับx > 0. การแก้ปัญหาทั้งสองเป็นผลมาจากการหาเหตุผลเข้าข้างตนเอง (พีชคณิต) ของ ODE ซึ่งแนะนำความเป็นไปได้ของการแก้ปัญหาที่ไม่เกี่ยวข้อง ในความเป็นจริงชุดโซลูชั่นประกอบด้วยสี่ส่วนที่เกี่ยวโยงกันสองช่วงเวลาและสองสำหรับx < 0 x > 0แต่ละโซลูชันที่ส่งคืนโดยSolveจะใช้ได้ในช่วงเวลาเดียว แต่ไม่เกินทั้งสองอย่าง อย่างไรก็ตามเราสามารถเปลี่ยนให้เป็นวิธีแก้ปัญหาที่ถูกต้องและไม่ถูกต้องเพียงวิธีSimplify[..., x > 0]เดียว แต่ฉันคิดว่านั่นไม่ใช่เทคนิคทั่วไป

วิธีแก้ปัญหา # 1

การค้นพบของ OP:

ode = -x == y'[x] y[x]/(1 + Sqrt[1 + (y'[x])^2]/2);

ListLinePlot[
 NDSolveValue[{ode, y[0] == 3}, y, {x, -7, 7}, 
  Method -> {"EquationSimplification" -> "Residual"}],
 PlotRange -> All
 ]

วิธีแก้ปัญหา # 2

การแยกความแตกต่างของ ODEจะเพิ่มคำสั่งซื้อ แต่ผลลัพธ์จะมีรูปแบบที่ชัดเจนไม่ซ้ำกัน คุณต้องใช้ ODE เพื่อแก้ไขเงื่อนไขเริ่มต้นสำหรับy'[0].

sol = NDSolve[{D[ode, x], y[0] == 3, y'[0] == 0}, y, {x, -7, 7}]

วิธีแก้ปัญหา # 3

ใช้แบบฟอร์มที่ชัดเจนที่ถูกต้องสร้างจากสาขาที่ถูกต้องสำหรับx <> 0:

ode2 = y'[x] == 
   Piecewise[{
    {(4 x y[x] - Sqrt[3 x^4 + 4 x^2 y[x]^2])/(x^2 - 4 y[x]^2), x < 0}}, 
    (4 x y[x] + Sqrt[3 x^4 + 4 x^2 y[x]^2])/(x^2 - 4 y[x]^2)];

sol = NDSolve[{ode2, y[0] == 3}, y, {x, -7, 7}]

วิธีแก้ปัญหา # 4

มีปัญหาเกี่ยวกับสัญกรณ์เกี่ยวกับพีชคณิตและความสัมพันธ์กับฟังก์ชันพีชคณิต การใช้สมมติฐานx > 0 จะเปลี่ยนแปลงการเลือกแบบตัดกิ่งเมื่อทำให้วิธีแก้ปัญหาที่ส่งคืนง่ายขึ้นSolveเพื่อให้หนึ่งในนั้นถูกต้อง กล่าวอีกนัยหนึ่งสิ่งนี้ให้สูตรที่ง่ายกว่าy'[x]ซึ่งเทียบเท่ากับวิธีแก้ปัญหาชั่วคราว # 3

sol = NDSolve[{#, y[0] == 3} /. Rule -> Equal, y, {x, -7, 7}] & /@
  Assuming[x > 0,
   Select[Simplify@Solve[ode, y'[x]], 
    ode /. # /. {y[x] -> 1, x -> 1.`20} &]
   ] // Apply[Join]

วิธีแก้ปัญหา # 5

Solveตัวเลือกที่จะแก้ไขปัญหาที่ถูกต้องในรูปแบบของMethod -> Reduce ConditionalExpressionเพื่อให้ได้วิธีการตรวจสอบและเลือกสาขาที่ถูกต้องของ ODE ที่กำหนดโดยปริยายy'[x]ผู้ใช้จะต้องดำเนินการก่อนการประมวลผลของตนเอง ต่อไปนี้เป็นวิธีในการrhs[]เลือกสาขาที่ตรงตาม ODE ดั้งเดิมโดยการแปลงนิพจน์เงื่อนไขเป็นPiecewiseฟังก์ชันเดียว เงื่อนไขจะถูกแปลงจากสมการที่จะเปรียบเทียบa == b Abs[a-b] < 10^-8ฉันต้องเพิ่มมูลค่าที่จุดสาขาx == 0ด้วยตนเอง

กล่าวอีกนัยหนึ่งคือการตรวจสอบy'[x]ในแต่ละขั้นตอนและเลือกสาขาที่ถูกต้องสำหรับขั้นตอนนั้น มันจะสลับสาขาโดยอัตโนมัติเมื่อจำเป็นx == 0ในปัญหาของ OP เป็นสิ่งที่ควรค่าแก่การชี้ให้เห็นว่าวิธีนี้ช่วยแก้ปัญหาที่เกิดจากการหาเหตุผลเข้าข้างตนเองของ ODE ที่แนะนำสาขาที่ไม่เกี่ยวข้อง เป็นไปได้ที่ ODE รูปแบบนัยจะมีสาขาที่ถูกต้องหลายสาขา วิธีการด้านล่างนี้จะรวมเข้าด้วยกันทั้งหมด (หากโซลูชันมีConditionalExpressionแบบฟอร์ม) ซึ่งควรถือเป็นข้อผิดพลาดแม้ว่าจะยังคงให้ผลลัพธ์ที่ถูกต้องโดยไม่ได้ตั้งใจ สำหรับ ODE ของ OP นั้นเป็นสิ่งที่ถูกต้อง

ClearAll[rhs];
rhs[x_?NumericQ, y_?NumericQ] = Piecewise[
   yp /. Solve[ode /. {y[x] -> y, y'[x] -> yp}, yp, 
       Method -> Reduce] /. ConditionalExpression -> List /. 
    Equal -> (Abs[#1 - #2] < 10^-8 &),
   0 (* y'[0] == 0 *)];

sol = NDSolve[{y'[x] == rhs[x, y[x]], y[0] == 3}, y, {x, -7, 7}]

นี่เป็นวิธีที่แฮ็กมากในการแก้ไขผลลัพธ์ของSolveผลลัพธ์ภายใน มันจะทำได้โดยลำดับของไวรัสUpValuesสำหรับ$tagที่เขียนซ้ำConditionalExpressionวิธีการแก้ปัญหาเป็นPiecewiseวิธีการแก้ปัญหาอย่างหนึ่งดังกล่าวข้างต้น

opts = Options@Solve;
SetOptions[Solve, Method -> Reduce];
Block[{ConditionalExpression = $tag, $tag},
 $tag /: Rule[v_, $tag[a_, b_]] := $tag[v, a, b];
 $tag /: {$tag[v_, a_, b_]} := $tag[List, v, a, b];
 $tag /: call : {$tag[List, v_, __] ..} := {{v -> 
     Piecewise[
      Unevaluated[call][[All, -2 ;;]] /. $tag -> List /. 
       Equal -> (Abs[#1 - #2] < 1*^-8 &)]}};
 sol = NDSolve[{ode, y[0] == 3}, y, {x, -7, 7}]
 ]
SetOptions[Solve, opts];

วิธีดูว่าSolveภายในมีอะไรบ้างNDSolve

Traceหากคุณต้องการที่จะเห็นสิ่งที่เกิดขึ้นภายในคุณสามารถใช้ NDSolveใช้Solveเพื่อแก้ ODE สำหรับอนุพันธ์ลำดับสูงสุดถ้าทำได้และใช้วิธีการแก้ปัญหาเพื่อสร้างอินทิกรัล สิ่งนี้แสดงการSolveโทรและค่าส่งคืน:

Trace[
 NDSolve[
  {ode, y[0] == 3},
  y, {x, -7, 7}],
 _Solve,
 TraceForward -> True,
 TraceInternal -> True
 ]
3 BobHanlon Nov 21 2020 at 17:49
Clear["Global`*"]

sol = DSolve[{-x == y'[x] y[x]/(1 + Sqrt[1 + (y'[x])^2]/2), y[0] == 3}, y, 
   x] // Quiet

(* {{y -> Function[{x}, Sqrt[5 - x^2 + 2 Sqrt[4 - x^2]]]}, 
    {y -> Function[{x}, Sqrt[45 - x^2 - 6 Sqrt[36 - x^2]]]}} *)

FunctionDomain[y[x] /. sol[[1]], x]

(* -2 <= x <= 2 *)

โซลูชันแรกใช้ได้สำหรับ -2 <= x <= 2

{-x == y'[x] y[x]/(1 + Sqrt[1 + (y'[x])^2]/2), y[0] == 3} /. sol[[1]] // 
 Simplify[#, -2 <= x <= 2] &

(* {True, True} *)

FunctionDomain[y[x] /. sol[[2]], x]

(* -6 <= x <= 6 *)

วิธีที่สองเป็นจริงสำหรับ x == 0

{-x == y'[x] y[x]/(1 + Sqrt[1 + (y'[x])^2]/2), y[0] == 3} /. sol[[2]] // 
 FullSimplify[#, -6 <= x <= 6] &

(* {x == 0, True} *)

Plot[Evaluate[y[x] /. sol], {x, -6, 6},
 PlotLegends -> Placed[Automatic, {.75, .2}]]

สำหรับโซลูชันตัวเลข จำกัด โดเมนไว้ที่ {- 2, 2}

soln = NDSolve[{-x == y'[x] y[x]/(1 + Sqrt[1 + (y'[x])^2]/2), y[0] == 3}, 
    y, {x, -2, 2}] // Quiet;

โซลูชันตัวเลขใช้ได้ในส่วนต่างๆของโดเมน

Plot[Evaluate[y[x] /. soln], {x, -2, 2},
 PlotRange -> {0, 3.1},
 PlotLegends -> Placed[Automatic, {.7, .5}]]

SteffenJaeschke Nov 27 2020 at 15:41

เริ่มต้นที่

Plot[Evaluate[y[x] /. sol], {x, -2, 2}, 
 PlotLegends -> Placed[Automatic, {.75, .2}], PlotPoints -> 1600, 
 ImageSize -> Large, PlotRange -> Full]

สมการเชิงอนุพันธ์คืออะไร?

$$\frac{𝑦′𝑦}{1+\sqrt{1+𝑦′^2}}=−𝑥$$

  1. นี่คือสมการเชิงอนุพันธ์ของชนิดนัย

  2. มันเป็นสมการเชิงอนุพันธ์ของลำดับที่หนึ่ง ${y,y'}$.

  3. มันเป็นสมการเชิงอนุพันธ์แบบไม่เชิงเส้น

  4. มันถูกกำหนดให้อยู่ในรูปของผลหารดังนั้นจึงจำเป็นต้องตรวจสอบความเป็นเอกฐานของตัวส่วน

  5. มีการเลือกเครื่องหมายของรากของระดับที่สองในตัวส่วนที่ต้องได้รับการปฏิบัติ ตัวส่วนต้องไม่เป็นศูนย์สำหรับจริง$x$ และ $y'$ ตราบเท่าที่มีการเลือกสัญลักษณ์ของราก

  6. มีรูปแบบของสมการเชิงอนุพันธ์ที่กำหนดโดยที่ $f(x,y,y')==0$:

    y '[x] == Piecewise [{(4 xy [x] - Sqrt [3 x ^ 4 + 4 x ^ 2 y [x] ^ 2]) / (x ^ 2 - 4 y [x] ^ 2 ), x <0}}, (4 xy [x] + Sqrt [3 x ^ 4 + 4 x ^ 2 y [x] ^ 2]) / (x ^ 2 - 4 y [x] ^ 2)]

ด้วยเหตุนี้เราจึงทราบข้อเท็จจริงที่แตกต่างกันเกี่ยวกับสิ่งที่ Mathematica สามารถทำเพื่อเราได้!

A. สามารถแก้ปัญหาได้ด้วยDSolve! DSolve แก้สมการเชิงอนุพันธ์สำหรับฟังก์ชัน u ด้วยตัวแปรอิสระ $x$ สำหรับ $x$ระหว่างSubscript[x, min]และSubscript[x, max]. B. เราไม่ต้องการ NDSolve เลย C. เนื่องจากการพึ่งพาการทำงานนั้นคงที่และแตกต่างกันไปตามช่วงเวลาที่กำหนดโซลูชันจึงมีคุณสมบัตินี้ในช่วงเวลาด้วย

จากคำถามมีปัญหาหนึ่งที่เปิดอยู่สำหรับการแก้ปัญหาที่เหมาะสม สิ่งที่เป็น$x_min$ และ $x_max$เหรอ?

จากการแก้ปัญหาของ DSolve:

sol = DSolve[{-x == y'[x] y[x]/(1 + Sqrt[1 + (y'[x])^2]/2), 
   y[0] == 3}, y, x]

( {{y -> ฟังก์ชัน [{x}, Sqrt [5 - x ^ 2 + 2 Sqrt [4 - x ^ 2]]]}, {y -> ฟังก์ชัน [{x}, Sqrt [45 - x ^ 2 - 6 Sqrt [36 - x ^ 2]]]}} )

เราได้รับข้อมูลว่าโซลูชันไม่ จำกัด เฉพาะโดเมนโซลูชัน ด้วยสมการเชิงอนุพันธ์ดั้งเดิมเป็นอินพุตเราจะได้ข้อมูลที่DSolveเรียกใช้วิธีการในตัว Mathematica สำหรับการคำนวณฟังก์ชันผกผันของสมการเชิงอนุพันธ์ Reduceดังนั้นมันจะเรียก การส่งออกไม่รวมถึงการใด ๆ Reduceของผลที่ได้จาก

ข้อความเหล่านี้ถูกสร้างขึ้นเพื่อหยุดข้อความเพิ่มเติมเช่นเดิมในคิวเอาต์พุตข้อความกลาง ในที่สุดก็พบ "วิธีแก้ปัญหา" # 3 จาก@ michael-e2แต่นั่นเป็นกระบวนการในตัวและไม่ใช่ "วิธีแก้ปัญหา" มิฉะนั้นชุดโซลูชันจะว่างเปล่า

ดังนั้นสิ่งที่ จำกัด การแก้ปัญหาสำหรับโดเมนคือการเลือกที่แสดงโดย@ Bob-HanlonFunctionDomainโดยใช้ ข้อกำหนดด้านการFunctionDomain Realsที่ไม่ได้ระบุไว้ในคำถาม และ NDSolve จะไม่ จำกัด วิธีการแก้ปัญหาRealsไว้ที่ เมื่อภาพเกริ่นนำของฉันปรากฏขึ้นไม่มีปัญหากับวิธีแก้ปัญหาแรก

เราต้องการการพิจารณาทางเรขาคณิตบางอย่าง สมการเชิงอนุพันธ์ที่กำหนดซึ่งเป็นแบบไม่เชิงเส้นอธิบายถึงการเปลี่ยนจุดไข่ปลาและขอบเขตของพวกมันเท่านั้น ดังนั้นสาขาที่แสดงโดย@ bob-hanlonนอกโดยการ จำกัด การRealsปรากฏจึงไม่ถูกต้องอีกต่อไป วงรีไม่ขยายออกไปอย่างไม่มีที่สิ้นสุด

วิธีแก้ปัญหาจะต้องได้รับการปฏิบัติต่อไปจนกว่าจะมีการประเมินผลที่สมเหตุสมผล ข้อกำหนดของคณิตศาสตร์คือการเอารากออกจากคำอธิบาย เราไม่ต้องการการผกผันสำหรับ$x(y)$. มีคำอธิบายจำนวนมากสำหรับจุดไข่ปลาในวิชาคณิตศาสตร์

แนวทางแก้ไข:

GraphicsGrid[{{Graphics[Circle[{0, 0}, {2, 3}], Axes -> True, 
    PlotRange -> {{-6, 6}, {-3.1, 3.1}}], 
   Graphics[Circle[{0, 0}, {5.2, 3}], Axes -> True, 
    PlotRange -> {{-6, 6}, {-3.1, 3.1}}]}}]

ทำไมเราถึงมีสิ่งนี้? ตกลง. Realsเพราะนี่คือความไม่เป็นเชิงเส้นของสมการเชิงอนุพันธ์และสมการเชิงอนุพันธ์ที่ตัวเองเป็น$x(0)==3$แก้ไขจุดไข่ปลาอย่างสมบูรณ์ มีเพียงพารามิเตอร์เดียวที่จะแก้ไขได้ฟรี Mathematica คำนวณโดยใช้Reduce. เราสามารถทำได้โดยใช้มือตามคำตอบอื่น นั่นคือสิ่งที่จำเป็น

ขั้นตอนนี้ซับซ้อนพอ ๆ กับการยอมรับว่า Mathematica จัดประเภทเหมือนกับที่ฉันทำภายในสมการเชิงอนุพันธ์อย่างชัดเจนในNDSolve. วิธีการแก้ปัญหาส่งมอบกระบวนการแก้ปัญหาสมการเชิงอนุพันธ์ให้DSolveและกว่าจะสอดแทรกโซลูชันที่นำมาจากกระบวนการนี้ นี่เป็นกรณีพิเศษของการประเมินความเกียจคร้าน ดังนั้นคำตอบของฉันไม่ใช่การแก้ปัญหานี้DSolveแต่ใช้NDSolveแทน แต่ใช้เส้นทางที่นำหัว

ความแตกต่างไม่ได้รับการแก้ไขด้วยวิธีนั้น ความสำคัญของ "วิธีแก้ปัญหา" # 3 จาก@ michael-e2เทียบกับวิธีแก้ปัญหาอื่น ๆ ทั้งหมดของเขาสามารถคิดค้นขึ้นใหม่ได้โดยการจบเส้นทางไปยังคำตอบที่สมบูรณ์ของจุดไข่ปลาและยอมรับว่าเป็นคำตอบที่สมบูรณ์และทางคณิตศาสตร์เกี่ยวกับการแก้ปัญหาจริงและครึ่งหนึ่ง - ทางแก้ปัญหาอื่น ๆ ทั้งหมดเสนอที่นี่ การทำด้วยมือถือเป็นงานหนักและการเขียนจำนวนมาก การทำเช่นนี้กระบวนการ Mathematica ไม่ได้ทำให้งานทางคณิตศาสตร์เสร็จสมบูรณ์และถูกต้อง มันไม่ได้ติดตามงานที่Reduceทำ

แต่ให้เป็นแก่นแท้ของคำตอบหลีกเลี่ยงรากของผลลัพธ์จาก Mathematica ในกรณีส่วนใหญ่ในลักษณะที่ไม่ควรปรากฏในคำตอบของคุณนั้นใกล้เคียงกับคำตอบที่ถูกต้อง ดังนั้นจึงอาจเหมาะสมในการรักษาReduce $y$ และ $y'$เป็นอิสระและป้อนอย่างเพียงพอ ไม่มีในตัวสำหรับการทำงานในการถ่ายโอนงานที่Reduceทำเพื่อคุณในการแก้ปัญหาจากเอาต์พุต Mathematica นี่เป็นเรื่องของประสบการณ์ที่นักคณิตศาสตร์แต่ละคนสามารถบรรลุได้ ดังที่แสดงโดยคำตอบของ@ michael-e2สามารถนำไปสู่การแก้ปัญหาใหม่ ๆ ที่ผสมสัญญาณของรากทั้งหมด ดังนั้นวิธีแก้ปัญหาขั้นสุดท้ายจึงไม่ซ้ำใครคือไม่มีเครื่องหมายความสับสนเหลืออยู่ด้านหน้าราก