常微分方程数值解
时间:实验目的:
1.掌握用数学软件求微分方程数值解的方法;
2.通过实例学习用微分方程模型解决简化的实际问题1、精确解
DSolve 给出微分方程的精确解。1.1 求解 y[x]例子:
In[1]:= DSolve[y'[x]==Sin[x], y[x], x]Out[1]= {{y[x] -> C[1] - Cos[x]}}
其中 C[1] 是常数。如果给定边界条件,可以去掉常数 C[1]。In[1]:= DSolve[{y'[x]==Sin[x], y[0]==2}, y[x], x]Out[1]= {{y[x] -> 3 - Cos[x]}}
foo->bar 模式称为 rule,常用于化简。可以用模式匹配来提取 DSolve 返回的 rule.In[1]:={{f}} = DSolve[{y'[x]==Sin[x], y[0]==2}, y[x], x]Out[1]= {{y[x] -> 3 - Cos[x]}}In[2]:= f
Out[2]= y[x] -> 3 - Cos[x]这个 rule 可以这样用:In[3]:=y[x]+4 //.fOut[3]= 7-Cos[x]
但如果想化简 y[5]+4,直接用 y[5]//.f 就不行,因为 rule f 只能把 y[x] 转换成 3-Cos[x],它不认识 y[5]。但可以先把 f 中的 x 替换成 5,写成In[4]:=y[5]+4//.(f//.x->5)Out[4]=7-Cos[5]1.2 求解 y,即纯函数方式
虽然上面的方法看上去不错,但遇到 y[5]+y[6] 就不好办了。此时可以用存函数解的方式In[1]:= {{g}}=DSolve[{y'[x]==Sin[x], y[0]==2}, y, x]Out[1]= {{y -> Function[{x}, 3 - Cos[x]]}}In[2]:= g
Out[2]= y -> Function[{x}, 3 - Cos[x]]
此时容易用规则 g 来化简 y[5]+y[6],In[2]:= y[5]+y[6]//.g
Out[2]= 6 - Cos[5] - Cos[6]纯函数形式相对灵活一些。2、数值解
因为有些方程是没有公式解的,或公式解太复杂,从而没有实用价值。此时可以用数值方法求近似解。2.1 NDSolve
数值解在求解时必须给定边界值以及求解的范围。例子:
In[1]:= {{f}}=NDSolve[{y'[x]==Sin[x], y[0]==2}, y[x], x]
Out[1]:= {{y[x] -> InterpolatingFunction[{{0.,6.28319}}, <>][x]}}y[x] -> ... 是一个插值函数,自变量范围是 0~6.28319,即 0~2π。In[2]:= f/.x->2
Out[2]=y[2]->3.41615In[3]:=y[2]//.(f//.x->2)Out[3]= 3.41615用存函数的版本更方便
In[1]:= {{g}} = NDSolve[{y'[x] == Sin[x], y[0] == 2}, y, {x, 0, 2 Pi}]Out[1]= {{y-> InterpolatingFunction[{{0., 6.28319}}, <>]}}In[1]:= y[2]//.fOut[1]=3.41615用 Plot 作出图像来观测Plot[g[x], {x, 0, 2Pi}]
图 2-1 y[x] 的图像
2.2 各种不同的数值方法
NDSolve[...., Method-> \"......\"]Method ->
•\"ExplicitEuler\"
•\"LinearlyImplicitEuler\"•\"ExplicitRungeKutta\"•\"ImplicitRungeKutta\"
// 向前欧拉公式// 改进欧拉公式// 显式龙格-库塔// 隐式龙格-库塔
例子:
NDSolve[{y'[x]==Sin[x], y[0] == 2}, y, {x, 0, 2 Pi},Method -> \"ExplicitEuler\MaxSteps -> 100000]
欧拉方法需要很多步数,所以要指定 MaxSteps, 而龙格-库塔所需要的步数是少很多了。
NDSolve[{y'[x] == Sin[x], y[0] == 2}, y, {x, 0, 2 Pi},Method -> \"ExplicitRungeKutta\"]3. 作业p120-1