上一篇文章介绍了如何用IAuto求解一阶微分方程的仿真曲线或数据,但是一阶微分方程比较简单,场景也比较单一。在更复杂的场景中,经常会遇到二阶甚至三阶微分方程的场景,如下:
最高的是二阶,x1,x2,x3分别是函数f1。
(t)、f2
(t)、f3
(T),这里需要输出Y的仿真数据曲线。我们也可以用Matlab得到Y的数据。但基于‘会用Matlab就用Matlab,国产软件IAuto也很香’的原则,我们可以在IAuto中快速解决:第一步:先新建一个。iax文件(记得先保存文件路径)创建数学曲线空白页;
第二步:在表达式内容区定义一个dx,在更多设置中设置X的属性,X范围[0,10],曲线点1000;
注意,这里变量dx是(x的结束值-x的开始值)/曲线点的数量;第三步:在表达式内容中添加以下代码,定义初始条件和输出值,其中自定义全局变量IA。X1,IA。X2和内务部。X3分别对应微分方程x1。
、x2
、x3
;内务部。Dx1,IA。Dx2和IA。Dx3分别对应于x1。
、x2
、x3
IA的一阶导数。DDx1,IA。DDx2和IA。DDx3分别对应于x1。
、x2
、x3
的二阶导数;
设dx=10/1000;if(x==0){ IA。x1=1;//X1 IA的初始值。dx1=0;//X1 IA的一阶初始值。X2=1;//X1 IA.x2的初始值//X1=0;//X1 IA的一阶初始值。X3=3;//X1 IA.x3的初始值//X1 ia . x3=1;////X1 } else {//核心业务代码区}的一阶初始值;设y=IA。X1 2*IA。X2 IA。X3;y;//输出Y第四步:将微分方程组中每个方程的最高阶放在左边,其他项放在右边。之后,用自定义的全局变量替换方程中的参数:
内务部。DDx1=3-IA。X3内务部。X1-IA。Dx2-2*IA。Dx1//第一个等式IA。Dx2=IA。X2-2-IA。Dx3//第二个等式IA。DDx3=IA。Dx2 IA。X2-1a。X3;//第三个方程将上述三个方程的脚步放入else{}代码段:
设dx=10/1000;if(x==0){ IA。x1=1;//X1 IA的初始值。dx1=0;//X1 IA的一阶初始值。X2=1;//X1 IA的初始值。dx2=0;//X1 IA的一阶初始值。X3=3;//X1 IA的初始值。dx3=1;//X1 } else { ia . ddx 1=3-ia . x3-ia . X1-ia . dx2-2 * ia . dx1的一阶初始值;//第一个等式IA。Dx2=IA。X2-2-IA。Dx3//第二个等式IA。DDx3=IA。Dx2 IA。X2-1a。X3;//第三个方程};设y=IA。X1 2*IA。X2 IA。X3;y;//输出Y步骤5:分别对IA进行二次或一次积分。ddx 1(x1的二阶),IA。DX2(x2的一阶)和IA。步骤4中的ddx 3(x3的二阶)以获得IA。X1,IA。X2和内务部。X3;这里积分的程度取决于导数的深度。比如二阶需要两次积分才能得到原函数,三阶需要三次积分才能得到原函数。
//获取X1 IA。Dx1=IA。通过两次积分xx1(t)得到DDx1 * dx内务部。X1=IA。Dx1 * dx//对x2(t)积分一次,得到X2 IA。X2=IA。Dx2 * dx//一旦积分xx3(t)得到X3 IA。Dx3=IA。DDx3 * dx内务部。X3=IA。Dx3 * dx将上述整数代码添加到步骤4中的足迹代码中,如下所示:
设dx=10/1000;if(x==0){ IA。x1=1;//X1 IA的初始值。dx1=0;//X1 IA的一阶初始值。X2=1;//X1 IA的初始值。dx2=0;//X1 IA的一阶初始值。X3=3;//X1 IA的初始值。dx3=1;//X1 } else { ia . ddx 1=3-ia . x3-ia . X1-ia . dx2-2 * ia . dx1的一阶初始值;//第一个等式IA。Dx2=IA。X2-2-IA。Dx3//第二个等式IA。DDx3=IA。Dx2 IA。X2-1a。X3;//第三个方程//xx1(t)的二次积分给出X1 IA。Dx1=IA。DDx1 * dx内务部。X1=IA。Dx1 * dx//对x2(t)积分一次,得到X2 IA。X2=IA。Dx2 * dx//一旦积分xx3(t)得到X3 IA。Dx3=IA。DDx3 * dx内务部。X3=IA。Dx3 * dx};设y=IA。X1 2*IA。X2 IA。X3;y;//输出Y第六步:点击“绘制静态图表”按钮,得到Y的仿真数据和曲线;
这里值得注意的是dx的模拟精度,因为每个dx段是10/1000=0.01,所以存在一定的模拟误差。如果我们需要将dx的精度改为0.000001,只需要修改第五步的代码如下。其核心业务代码放在一个for循环中,整数运算中的dx(0.01)被替换为dxn(0.0000001)。
设dx=10/1000;设n=10000设dxn=dx/n;if(x==0){ IA。x1=1;//X1 IA的初始值。dx1=0;//X1 IA的一阶初始值。X2=1;//X1 IA的初始值。dx2=0;//X1 IA的一阶初始值。X3=3;//X1 IA的初始值。dx3=1;//的一阶初值//X1 }else{for(设I=0;I除了上述将dx化简为dxn的方法提高精度外,我们还可以使用另一种变步长积分方法提高精度(龙泽-库塔法),这种方法与需要n次运算的dxn相比,只需要4次迭代,从而减少计算量,达到更高的精度。其代码如下:
设dx=10/1000;if(x==0){ IA。x1=1;//X1 IA的初始值。dx1=0;//X1 IA的一阶初始值。X2=1;//X2 IA的初始值。X3=3;//X3 IA的初始值。dx3=1;//X3 }else{let A=[0,1/2,1/2,1]的一阶初值;for(设I=0;i4;i ){ IA。DDx1=3-IA。X3内务部。X1-IA。Dx2-2*IA。Dx1内务部。Dx2=IA。X2-2-IA。Dx3内务部。DDx3=IA。Dx2 IA。X2-1a。X3;//获取X1 IA。Dx1=IA。通过xx1(t)的二次积分得到ddx 1 * A[I]* dx/2;内务部。X1=IA。dx1 * dx/4;//对x2(t)积分一次,得到X2 IA。X2=IA。dx2 * A[I]* dx/2;//一旦积分xx3(t)得到X3 IA。Dx3=IA。ddx 3 * A[I]* dx/2;内务部。X3=IA。dx3 * dx/4;}};内务部。X1 2*IA。X2 IA。X3;两种方法都可以提高精度,第一种计算量较大,第二种计算量较小(推荐);除了这些,IAuto多功能绘图软件还可以用于各种基本的办公绘图场景;关注边肖,可以免费了解更多关于国产IAuto软件使用的教程!