Re: [問題] 非線性微分方程式

看板Mathematica作者 (forcing to A cup)時間13年前 (2011/12/03 01:04), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《marblepillar (Stanage Edge)》之銘言: : 大家好~ : 我想解一組非線性微分方程式 : 未知數有兩個:C0(t), C1(t) : 希望能在0 <= t <=1 這範圍內求解 : 1.DSolve[{4*(1+0.5*t^3)*C1[t]*C1[t]/9 - 2*(t-t^4)*C1[t]*C1'[t]/9 - t^3*C0"[t] : == 0, 2*t*C1[t] - 2*(t-t^4)*C1[t]*C0'[t]/3 - t^3*C1"[t] == 0, : C0[0] == 0, C1[0] == 0, C0'[1] == 0.5, C1'[1] == 0.75}, : {C0[t], C1[t]}, t] : 可是Mathematica回傳原方程式,是我哪裡寫錯或者沒有解析解呢? 你的方程式是highly coupled又是nonliner 可以很確定這幾乎沒有解析解 : 2.試試看求數值解 : NDSolve[{4*(1+0.5*t^3)*C1[t]*C1[t]/9 - 2*(t-t^4)*C1[t]*C1'[t]/9 - t^3*C0"[t] : == 0, 2*t*C1[t] - 2*(t-t^4)*C1[t]*C0'[t]/3 - t^3*C1"[t] == 0, : C0[0] == 0, C1[0] == 0, C0'[1] == 0.5, C1'[1] == 0.75}, : {C0[t], C1[t]}, {t,0,1}] : 也是回傳原方程式,而且多了一堆訊息,是說有些點譬如t=0時, : 會遇到1/0的情況... 這很明顯在該點是奇異點 mathematica在解數值積分或數值微分的數值方法裡面 會自動先判斷Boundary是否是奇異點 並且秀出訊息提供參考 根據7.0手冊tutorial/NumericalSolutionOfDifferentialEquations NDSolve follows the general procedure of reducing step size until it tracks solutions accurately. There is a problem, however, when the true solution has a singularity. In this case, NDSolve might go on reducing the step size forever, and never terminate. To avoid this problem, the option MaxSteps specifies the maximum number of steps that NDSolve will ever take in attempting to find a solution. For ordinary differential equations the default setting is MaxSteps->10000. : 3.設t0=0.0001 在t0 <= t <1-t0 內求解 : NDSolve[{4*(1+0.5*t^3)*C1[t]*C1[t]/9 - 2*(t-t^4)*C1[t]*C1'[t]/9 - t^3*C0"[t] : == 0, 2*t*C1[t] - 2*(t-t^4)*C1[t]*C0'[t]/3 - t^3*C1"[t] == 0, : C0[t0] == 0, C1[t0] == 0, C0'[1-t0] == 0.5, C1'[1-t0] == 0.75}, : {C0[t], C1[t]}, {t,t0,1-t0}] : {{C0[t]->InterpolatingFunction[{{0.0001,0.9999}},<>][t], : C1[t]->InterpolatingFunction[{{0.0001,0.9999}},<>][t]}} : 這樣就沒問題 是的 如果你用數學方法去檢驗你原有的耦合方程 我想t=0是一個很明顯的奇異點 (關於檢驗方法 請複習工程數學...我已經忘了五年了=__=~) : 4.當我想做複雜一點的計算 : 未知數有三個:C0[t], C1[t], C2[t] : eqn1=4*(1+0.5*t^3)*C1[t]*C1[t]/9 - 2*(t-t^4)*C1[t]*C1'[t]/9 - t^3*C0"[t] : -3*(t^3-t^5)*C2[t]*C2'[t]/5 + 6*t^4*C2[t]*C[2]/5 : eqn2=2*t*C1[t] - 2*(t-t^4)*C1[t]*C0'[t]/3 - t^3*C1"[t] : - 4*(t-t^4)*C1[t]*C2'[t]/15 -6*(t^3-t^5)*C2[t]*C1'[t]/5 : + 4*(1+0.5*t^3)*C1[t]*C2[t]/5 + 6*t^4*C1[t]*C2[t]/5 : eqn3=-4*(t-t^4)*C1[t]*C1'[t]/9 - 3*(t^3-t^5)*C2[t]*C0'[t] : -6*(t^3-t^5)*C2[t]*C2'[t]/7 - 4*(1+0.5*t^3)*C1[t]*C1[t]/9 : +6*t^4*C2[t]*C2[t]/7 - t^3*C2"[t] + 6*t*C2[t] : 設t0=0.0001 在t0 <= t <1-t0 內求解 : NDSolve[{eqn1== 0, eqn2 == 0, eqn3 == 0, : C0[t0] == 0, C1[t0] == 0, C2[t0] == 0, : C0'[1-t0] == 0.5, C1'[1-t0] == 0.75, C2'[1-t0] == 0}, : {C0[t], C1[t], C2[t]}, {t,t0,1-t0}] : 也是有數值解 : {{C0[t]->InterpolatingFunction[{{0.0001,0.9999}},<>][t], : C1[t]->InterpolatingFunction[{{0.0001,0.9999}},<>][t], : C2[t]->InterpolatingFunction[{{0.0001,0.9999}},<>][t]}} : 可是有訊息說會遇到singularity : NDSolve::ndsz::At t=0.24478, step size is effectively zero........ : General::stop :Further output of NDSolve::ndsz w : ill be suppressed during this calculation : 請問這些訊息會影響結果嗎? : 我該如何修正讓錯誤訊息不會出現呢? 上面你已經使用避開Boundary是奇異點了 接下來是關於mathematica在運算數值微分或積分解的時候 在不是boundary的部份是不會特別去判斷是否有奇異點 而是會懷疑 並且告知使用者 這部份可參考手冊tutorial/NDSolvePackages 意思就是說:你餵給我的東西太難吃了 我無法保證解出精確解 : 非常謝謝囉<(_ _)> 基本上 關於你的擔憂 建議使用最暴力的級數解去給它求出近似解 這樣會比較好喔 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.134.252.177

12/03 03:24, , 1F
soga~~大大感謝!!看來我要好好想想如何近似才行囉^^
12/03 03:24, 1F

12/03 22:40, , 2F
其實 你也可以設定Precision 在範圍之內的答案是ok的
12/03 22:40, 2F

12/06 06:36, , 3F
感謝樓上 我會試試看的:)
12/06 06:36, 3F
文章代碼(AID): #1EsGKiSp (Mathematica)
討論串 (同標題文章)
文章代碼(AID): #1EsGKiSp (Mathematica)