欢迎光临散文网 会员登陆 & 注册

mathematica软件的常用操作2——解微分方程、表达式、函数、控制理论相关操作

2023-06-26 19:48 作者:木修于淋  | 我要投稿

解微分方程:

解一元微分方程:

DSolve[y''[x] + a y'[x] + b y[x] == u, y[x], x],其中y''[x] + a y'[x] + b y[x] == u表示待求解的微分方程,y[x]表示因变量,就是待求解的自变量为x的函数,x表示自变量,求出结果如下:

DSolve[y''[x] + a y'[x] + b y[x] == u, y[x], x]

DSolve[y''[x] + 3 y'[x] + 3 y[x] == 0, y[x], x],输出结果如下:

DSolve[y''[x] + 3 y'[x] + 3 y[x] == 0, y[x], x]

也可以指定原函数和一阶导数在x=0处的初始值,这样解出的结果就没有c1和c2了,就是由通解变成了具体的一个解:

DSolve[y''[x] + 3 y'[x] + 3 y[x] == 0 && y[0] == 1 && y'[0] == 1,  y[x], x],其中y[0] == 1 && y'[0] == 1表示指定的初始值,输出结果如下:

DSolve[y''[x] + 3 y'[x] + 3 y[x] == 0 && y[0] == 1 && y'[0] == 1,  y[x], x]

解微分方程组:

DSolve[{y1'[x] + 2 y1[x] + 2 y2[x] == u1, y2'[x] + 3 y2[x] + 3 y1[x] == u2}, {y1, y2}, x] // FullSimplify,其中{y1'[x] + 2 y1[x] + 2 y2[x] == u1, y2'[x] + 3 y2[x] + 3 y1[x] == u2}表示要求解的微分方程组,当然也可以用前面那种&&表示,这里用了另一种表示方式;{y1, y2}表示要求解的函数,这里没有用y1[x]这种形式表示,当然也可以用,输出结果一样的,输出结果如下:

DSolve[{y1'[x] + 2 y1[x] + 2 y2[x] == u1, y2'[x] + 3 y2[x] + 3 y1[x] == u2}, {y1, y2}, x] // FullSimplify

可以给定初始值,消去上面通式中的c1和c2:

DSolve[{y1'[x] + 2 y1[x] + 2 y2[x] == u1, y2'[x] + 3 y2[x] + 3 y1[x] == u2, y1[0] == 1, y2[0] == 1}, {y1, y2}, x] // FullSimplify,其中y1[0] == 1, y2[0] == 1表示给定的初始值,输出结果如下:

DSolve[{y1'[x] + 2 y1[x] + 2 y2[x] == u1, y2'[x] + 3 y2[x] + 3 y1[x] == u2, y1[0] == 1, y2[0] == 1}, {y1, y2}, x] // FullSimplify

表达式操作:

因为我平时用到最多的表达式操作就是对传递函数进行处理,下面就以一个传递函数为例进行说明:

f1 = (ki + kp s)/(ki + s (kp + r + L s));这个为待处理的传递函数。

Numerator[f1],得到分子,输出为:ki + kp s。

Denominator[f1],得到分母,输出为:ki + s (kp + r + L s)。

Collect[Denominator[f1], s],合并分母的s相关的同类项,输出为:ki + (kp + r) s + L s^2,这样就可以得到s不同次项的系数。

Expand[(a + b) (c + d)],展开表达式,输出为:a c + b c + a d + b d。

其它使用方法可以去帮助文档查阅。

函数的定义与使用:

一元函数定义:

f11[x_] := x^2 + 1; 其中,:= 是延时赋值,表示调用时再执行赋值,表达式后面加分号就是不显示输出结果,要注意函数中括号里的自变量用x_表示,而不是x。

函数调用:

f11[1],输出为:2。

f11[a],输出为1 + a^2。

多元函数定义:

f2[x_, y_] := x^2 + y^2; 这里为函数定义。

f2[1, -1],函数调用,输出结果为2。

软件中还有些定义好的函数可以直接用,如Sin,Cos函数等,如:

ArcSin[Sqrt[3]/2],输出为pi/3。

Sin[60 Degree],其中Degree表示以度为单位,输出为Sqrt[3]/2。

控制理论相关操作:

拉普拉斯变换:

LaplaceTransform[Sin[2 t1], t1, s],其中Sin[2 t1]表示要变换的时域函数;t1表示时域自变量,不是固定的,和前面函数一致即可;s表示变换后的自变量,输出结果为:2/(4 + s^2)。

LaplaceTransform[E^(-2 t), t, s],E表示指数函数中的e,约为2.71828,输出结果为1/(2 + s)。

拉普拉斯反变换:

InverseLaplaceTransform[1/(s + 2), s, t],输出结果为:E^(-2 t)。

InverseLaplaceTransform[1/(s^2 + s + 2), s, t],输出结果为:

InverseLaplaceTransform[1/(s^2 + s + 2), s, t]

可画出上述曲线,其实就是原传递函数的冲击响应:

Plot[(2 E^(-t/2) Sin[(Sqrt[7] t)/2])/Sqrt[7], {t, 0, 20},  PlotRange -> Full],其中(2 E^(-t/2) Sin[(Sqrt[7] t)/2])/Sqrt[7]就是上面那个时域函数,PlotRange -> Full表示纵轴全范围展示,输出结果如下:

Plot[(2 E^(-t/2) Sin[(Sqrt[7] t)/2])/Sqrt[7], {t, 0, 20},  PlotRange -> Full]

还可以画出原传函的单位阶跃响应对应的曲线,相当于在原来s域传递函数的基础上再乘以单位阶跃函数的传递函数1/s,求其拉式反变换即可得到阶跃响应对应的时域函数:

单位阶跃响应对应的时域函数

输出结果如下:

上面拉式反变换的结果

画出其曲线可得:

画出时域函数对应的曲线
对应的曲线

可见其输出结果不能达到1,所以无法实现无静差跟踪。这里为方便大家知道如何去用,简单给大家代入到控制理论的一些内容来介绍此软件的使用方法。

画伯德图:

画伯德图

其中第一个表示目标传递函数,{0.001, 100}表示频率范围,单位为rad/s,不是Hz,和Hz差了个2 pi系数,输出结果如下:

BodePlot[1/(s^2 + s + 2), {0.001, 100}]

未完待续。。。。。。

大家感觉有帮助的话不妨动动小手点个赞吧。


mathematica软件的常用操作2——解微分方程、表达式、函数、控制理论相关操作的评论 (共 条)

分享到微博请遵守国家法律