NDSolve แก้ปัญหาผิด
พิจารณา 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ปัญหาจะยิ่งแย่ลงเนื่องจากตอนนี้สาขาหนึ่งผิดไปหมดทุกที่และอีกสาขาหนึ่งถูกต้องในพื้นที่เล็ก ๆ เท่านั้น
คำตอบ
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ซึ่งเป็นจุดบกพร่องที่นี่
ปัญหาทั่วไป
ในการใช้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
]
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}]]
เริ่มต้นที่
Plot[Evaluate[y[x] /. sol], {x, -2, 2},
PlotLegends -> Placed[Automatic, {.75, .2}], PlotPoints -> 1600,
ImageSize -> Large, PlotRange -> Full]
สมการเชิงอนุพันธ์คืออะไร?
$$\frac{𝑦′𝑦}{1+\sqrt{1+𝑦′^2}}=−𝑥$$
นี่คือสมการเชิงอนุพันธ์ของชนิดนัย
มันเป็นสมการเชิงอนุพันธ์ของลำดับที่หนึ่ง ${y,y'}$.
มันเป็นสมการเชิงอนุพันธ์แบบไม่เชิงเส้น
มันถูกกำหนดให้อยู่ในรูปของผลหารดังนั้นจึงจำเป็นต้องตรวจสอบความเป็นเอกฐานของตัวส่วน
มีการเลือกเครื่องหมายของรากของระดับที่สองในตัวส่วนที่ต้องได้รับการปฏิบัติ ตัวส่วนต้องไม่เป็นศูนย์สำหรับจริง$x$ และ $y'$ ตราบเท่าที่มีการเลือกสัญลักษณ์ของราก
มีรูปแบบของสมการเชิงอนุพันธ์ที่กำหนดโดยที่ $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สามารถนำไปสู่การแก้ปัญหาใหม่ ๆ ที่ผสมสัญญาณของรากทั้งหมด ดังนั้นวิธีแก้ปัญหาขั้นสุดท้ายจึงไม่ซ้ำใครคือไม่มีเครื่องหมายความสับสนเหลืออยู่ด้านหน้าราก