
这个问题用MATLAB求解非常简单,但是题目好像有两个问题:
1、两组微分方程中的方程是否应分别为dx1/dt和dx2/dt?
2、这两个系统的过渡过程很短,没必要把仿真时间设太长(事实上,1秒都显的太长)。
程序代码如下(tf为仿真时间,可酌情修改):
dx1 = inline('[-(x(1)-1)^3-(x(1)-1)x(2)^2; -x(2)^5]', 't', 'x');dx2 = inline('[-x(1)^3-x(1)x(2)^2; -x(2)^3]', 't', 'x');
X0 = [-100, 40; -100, -50; 001 60; 100 100];
n = size(X0,1);
tf = 05;
for i=1:n
x0 = X0(i, :);
[t, x] = ode45(dx1, 0:001:tf, x0);
subplot(n, 2, (i-1)2+1)
plot(t, x)
legend('x_1', 'x_2', 0)
ylabel(sprintf('x_0 = (%3g, %3g)', x0));
if i==1, title('系统I'); end
[t, x] = ode45(dx2, 0:001:tf, x0);
subplot(n, 2, i2)
plot(t, x)
legend('x_1', 'x_2', 0)
if i==1, title('系统II'); end
end
结果效果图(把2个系统、4组初值分别仿真,得到8组曲线):
MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
方程或者初始条件有问题,请认真核实。
原因:如果按照现在的初始条件,则第一个微分方程各项为0,方程不起作用。而且就算法而言,二阶(最高阶)导数的系数为0,会导致数值积分算法无法启动。
参考代码大致如下:
m=1;g=98;
k=100;
l0=11;
x0=[01 0 0 0];
% 定义x1=l, x2=l', x3=a, x4=a'
dx=#(t,x)[x(2); (mx(1)x(4)^2-mgcos(x(3))-k(x(1)-l0))/m;
x(4); (-2mx(1)x(2)x(4)+mgx(1)sin(x(3)))/(mx(1)^2)];
[t,x]=ode15s(dx,[0 10],x0);
lstr = { '\itl', '{\itl}''', '\alpha', '\alpha''' };
for i=1:length(lstr)
subplot(2,2,i)
plot(t, x(:,i));
xlabel('Time')
ylabel( lstr{i} )
end
注意:其中的#应为电子邮件的AT符,在MATLAB中表示匿名函数。因出现这个字符就会被识别为邮件地址,很可能回答无法正常显示(恶心的度娘,鄙视),所以,慎重起见,这里以#代替。
以上就是关于求高手解决此数值分析编程问题,c++或者matlab都可以全部的内容,包括:求高手解决此数值分析编程问题,c++或者matlab都可以、matlab是什么、二元二阶微分方程组求数值解的matlab程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)