NDSolve中使用了一个只能接收常数的函数,导致t变化时无法读取
mathematica吧
全部回复
仅看楼主
level 1
海天热血 楼主
简单描述一下:RiccatiSolve[]函数接收四个常值矩阵后会返回一个常值矩阵。我的代码:
Ar[t_] := t*DiagonalMatrix[{1, 1}];
MB[t_] := t^2*DiagonalMatrix[{1, 1}];
MQ = {{1, 0}, {0, 2}};
MR = {{1, 2}, {0, 3}};
P[t_] := RiccatiSolve[{Ar[t], MB[t]}, {MQ, MR}];
P[2]
NDSolve[Total[P[t] // Flatten] == x'[t], t, {t, 0, 5}]
输出结果:P[2]=
但是NDSolve的输出:RiccatiSolve::nonnum: RiccatiSolve has received a matrix with non-numerical elements.
NDSolve::ndnco: The number of constraints (0) (initial conditions) is not equal to the total differential order of the system plus the number of discrete variables (1).
也就是说,RiccatiSolve[]在直接给出时间的时候,它可以给出对应时间的Ar[t]和MB[t]对应的结果,但是在NDSolve中,时间t变化时,它却不能给出结果。问题出在了NDSolve上。请问怎么解决。
求求了!!!
2021年11月18日 12点11分 1
吧务
level 10
首先,NDSolve的第二参数应为x而不是t
然后,P[t]在t=0附近算不出符号解,可能需要给一个小的偏移。
2021年11月19日 10点11分 2
谢谢回复!上面的代码确实写的有语法错误,因为我为了简化问题,写了这样的代码。但是您可以试一下调整t为x,以及设置为{t,0.1,0.3},结果还是错的。因为NDSolve会把RiccatiSolve在t为未知数的时候写入内存,这时候因为t为未知量,RiccatiSolve不能接受进行计算,就会报错。
2021年11月19日 20点11分
@asdasd1dsadsa 而且在NDSolve开始从0.1到0.3给t赋值的时候,RiccatiSolve并不能接收到t的常数值,因为它已经在t为未知量的时候被处理掉了,这时候方程里相当于并没有RiccatiSolve。请问这种情况怎么解决?
2021年11月19日 20点11分
@asdasd1dsadsa 另外并不只有RiccatiSolve有这样的情况,凡是不能接收未知量的函数,在NDSolve中形式为RiccatiSolve[t]的时候,都会报错。
2021年11月19日 20点11分
@海天热血 噢,我忘记说了,符号计算的问题加个?NumericQ就行
2021年11月19日 20点11分
1