微分方程系数是分段函数的,该怎么求解呢
mathematica吧
全部回复
仅看楼主
level 3
XFX的6990 楼主
求问各位大佬,如果微分方程的系数是分段函数该怎么求解,自己编的总是出错。代码:
a0l = 5.9; \[Lambda]1 = 0.15; \[Lambda]2 = 0.55;(*线性方程系数*)
b = 1;(*半弦长*); U = 0.1 340;
k = 0.1;(*减缩频率*)
\[Omega] = k U/b;
\[Theta] = 9.82 Pi/180 + 9 Pi/180 Cos[\[Omega] t];(*俯仰*)
h = 0;(*沉浮运动*)
\[Alpha] = \[Theta] - D[h, t]/U;
t\[Tau] = b/U;(*无量纲时间转换系数*)
\[CapitalDelta]CL =
Piecewise[{{6.32284 (x\[Alpha] + 0.1396) -
0.42284 (x\[Alpha] + 0.3142),
x\[Alpha] < -0.3142}, {6.32284 (x\[Alpha] + 0.1396), -0.3142 <=
x\[Alpha] < -0.1396}, {0, -0.1396 <= x\[Alpha] <
0.1396}, {6.32284 (x\[Alpha] - 0.1396),
0.1396 <= x\[Alpha] < 0.3142}, {6.32284 (x\[Alpha] - 0.1396) -
0.42284 (x\[Alpha] - 0.3142), x\[Alpha] >= 0.3142}}]
dCL = D[\[CapitalDelta]CL, x\[Alpha]]
Plot[\[CapitalDelta]CL, {x\[Alpha], -0.4, 0.4}];
Plot[dCL, {x\[Alpha], -0.4, 0.4}];
r1L = 0.25 + 0.1 (\[CapitalDelta]CL)^2;
r2L = (0.2 + 0.1 (\[CapitalDelta]CL)^2)^2;
r3L = (0.2 +
0.1 (\[CapitalDelta]CL)^2)^2 (-0.6 \[CapitalDelta]CL^2);(*非线性系数*)
equ2 = t\[Tau]^2 D[Cl2[t], {t, 2}] + t\[Tau] r1L D[Cl2[t], t] +
r2L Cl2[t] == -r2L \[CapitalDelta]CL -
t\[Tau] r3L dCL D[\[Alpha], t] /. x\[Alpha] -> \[Theta]
ans2 = NDSolve[{equ2, Cl2[0] == 0}, Cl2, {t, 0, 2 Pi/\[Omega]}]
程序报错NDSolve::ndnco: The number of constraints (6) (initial conditions) is not equal to the total differential order of the system plus the number of discrete variables (7).
非常感谢!
2019年11月02日 14点11分 1
吧务
level 15
警告信息已经说得很清楚了。你的方程是2阶的,你却只给了一个限制条件。条件不够,定不了解。
2019年11月02日 14点11分 2
level 3
XFX的6990 楼主
谢谢吧主,我添加了Cl2'[0]==0的条件,可以求出来了,不过数值特别大,提示NDSolve::nlnum: The function value {-7.51504,Indeterminate} is not a list of numbers with dimensions {2} at {t,Cl2[t],(Cl2^\[Prime])[t],NDSolve`s$12871[t],NDSolve`s$12870[t],NDSolve`s$12869[t],NDSolve`s$12873[t],NDSolve`s$12872[t]} = {0.126342,-0.712098,-7.51504,1,1,1,-1,1}.这是什么原因呢
2019年11月02日 15点11分 3
感觉这个分段函数还是有问题,虽然算出来了,但是数据特别大。我把这个分段函数换成一个连续的拟合函数后,结果就比较好了。但是不知道这个分段函数哪地方出问题了,因为后面还要用到类似的分段函数问题,想搞清楚一点。非常感谢
2019年11月02日 15点11分
吧务
level 15
应该是分段函数的不光滑点导致的问题,这些位置求导后变成了Indeterminate,导致求解失败。一个可行的(但应该不是唯一的)改法是用个近似于不连续的连续函数代替原函数:
appro = With[{k = 1000}, ArcTan[k #]/Pi + 1/2 &];
\[CapitalDelta]CL =
Simplify`PWToUnitStep[
\[CapitalDelta]CL] /. UnitStep -> appro
直接把Indeterminate的部分强制换掉可能也可以,但这要先分析\[CapitalDelta]CL的不光滑处是否求导后会产生DiracDelta,今天时间不够了,你先自己试试吧……
2019年11月02日 15点11分 4
等式右边的\[CapitalDelta]CL就是你的\[CapitalDelta]CL。代码一长就被百度判成了广告,没辙。
2019年11月02日 15点11分
@xzcyr 好的,非常感谢🙏
2019年11月02日 16点11分
@xzcyr 问题解决了,是我编程习惯不好。DeltaCl是一个分段函数,dDeltaCl是上一个导数,直接用求导指令赋值,然后计算微分方程就出错。我不用求导指令直接把导数值赋给dDeltaCl就可以了[泪]
2019年11月03日 03点11分
1