零基础学VB6.0仿真:用四阶龙格库塔法计算传递函数状态方程的结果

目录

前言

一、数学模型

二、算法介绍-四阶龙格库塔法(RUNGE-KUTTA)

三、VB编程

1.编译环境:VB6.0

2.新建工程

3.主程序

4.子函数

5.运行验证

总结


前言

课程探究:连续系统的数值积分,选择合适的编程语言与环境对数学模型进行仿真,求解结果。

连续系统仿真步骤:

1  建立数学模型:微分方程、状态方程、传递函数

2  建立仿真模型:选择仿真算法,将数学模型转化为仿真模型

3  编写运行程序:选择某种语言,写出计算机仿真程序,进行运行,获得仿真结果

一、数学模型

根据前一篇文章的数学模型

G(s)=\frac{2s+6}{s^{3}+7s^{2}+14s+8}=\frac{s+3}{s+1}\cdot \frac{2}{s+2}\cdot \frac{1}{s+4}=\frac{4/3}{s+1}-\frac{1}{s+2}-\frac{1/3}{s+4}

不懂级并串的参考上一篇文章:级联、串联、并联求传递函数的方框图和状态方程

二、算法介绍-四阶龙格库塔法(RUNGE-KUTTA)

省略推导公式,直接给出龙格库塔公式:

\begin{aligned} x_{k+1}&=x_{k}+\left ( k_{1}+2 k_{2}+2 k_{3}+ k_{4} \right )/6\\ k_{1}&=h*f\left ( x_{k},t_{k} \right ) \\ k_{2}&=h*f\left ( x_{k}+k_{1}h/2,t_{k}+h/2 \right ) \\ k_{3}&=h*f\left ( x_{k}+k_{2}h/2,t_{k}+h/2 \right ) \\ k_{4}&=h*f\left ( x_{k}+k_{3}h,t_{k}+h \right ) \\ \end{aligned}

其中,h为求解步长。

三、VB编程

1.编译环境:VB6.0

2.新建工程

新建CommandButton和Textbox

 双击“Command1”,写程序

3.主程序

Private Sub Command1_Click()
Dim h As Single
Dim t As Single
Dim I As Integer
h = 0.1
'h是步长0.1
t = 0
For I = 1 To 200
'I 仿真200步
t = t + h
k11 = h * f1(x1, x2, x3, x4, t)
k21 = h * f2(x1, x2, x3, x4, t)
k31 = h * f3(x1, x2, x3, x4, t)
k41 = h * f4(x1, x2, x3, x4, t)

k12 = h * f1(x1 + k11 / 2, x2 + k21 / 2, x3 + k31 / 2, x4 + k41 / 2, t + h / 2)
k22 = h * f2(x1 + k11 / 2, x2 + k21 / 2, x3 + k31 / 2, x4 + k41 / 2, t + h / 2)
k32 = h * f3(x1 + k11 / 2, x2 + k21 / 2, x3 + k31 / 2, x4 + k41 / 2, t + h / 2)
k42 = h * f4(x1 + k11 / 2, x2 + k21 / 2, x3 + k31 / 2, x4 + k41 / 2, t + h / 2)

k13 = h * f1(x1 + k12 / 2, x2 + k22 / 2, x3 + k32 / 2, x4 + k42 / 2, t + h / 2)
k23 = h * f2(x1 + k12 / 2, x2 + k22 / 2, x3 + k32 / 2, x4 + k42 / 2, t + h / 2)
k33 = h * f3(x1 + k12 / 2, x2 + k22 / 2, x3 + k32 / 2, x4 + k42 / 2, t + h / 2)
k43 = h * f4(x1 + k12 / 2, x2 + k22 / 2, x3 + k32 / 2, x4 + k42 / 2, t + h / 2)


k14 = h * f1(x1 + k13, x2 + k23, x3 + k33, x4 + k43, t + h)
k24 = h * f2(x1 + k13, x2 + k23, x3 + k33, x4 + k43, t + h)
k34 = h * f3(x1 + k13, x2 + k23, x3 + k33, x4 + k43, t + h)
k44 = h * f4(x1 + k13, x2 + k23, x3 + k33, x4 + k43, t + h)

x1 = x1 + (k11 + 2 * k12 + 2 * k13 + k14) / 6
x2 = x2 + (k21 + 2 * k22 + 2 * k23 + k24) / 6
x3 = x3 + (k31 + 2 * k32 + 2 * k33 + k34) / 6
x4 = x4 + (k41 + 2 * k42 + 2 * k43 + k44) / 6

Next I
Text1.Text = x4
End Sub

4.子函数

要计算传递函数的结果,需要将其转化为状态方程,子函数是根据状态方程编写的。

级联法函数

\begin{cases} x_{1}^{'}=u-7x_{1}-14x_{2}-8x_{3}\\ x_{2}^{'}=x_{1}\\ x_{3}^{'}=x_{2}\\ y=2x_{2}+6x_{3} \end{cases}

Function f1(x1, x2, x3, x4, t As Single)
f1 = 1 - 7 * x1 - 14 * x2 - 8 * x3
End Function

Function f2(x1, x2, x3, x4, t As Single)
f2 = x1
End Function

Function f3(x1, x2, x3, x4, t As Single)
f3 = x2
End Function

Function f4(x1, x2, x3, x4, t As Single)
f4 = 2 * x2 + 6 * x3
End Function

串联法函数

\begin{cases} x_{1}^{'}=u-x_{1}\\ x_{2}^{'}=x_{1}^{'}+3x_{1}-2x_{2}=u+2x_{1}-2x_{2}\\ x_{3}^{'}=2x_{2}-4x_{3}\\ y=x_{3} \end{cases}

Function f1(x1, x2, x3, x4, t As Single)
f1 = u - x1
End Function

Function f2(x1, x2, x3, x4, t As Single)
f2 = 1 + 2 * x1 - 2 * x2
End Function

Function f3(x1, x2, x3, x4, t As Single)
f3 = 2 * x2 - 4 * x3
End Function

Function f4(x1, x2, x3, x4, t As Single)
f4 = x3
End Function

并联法函数

\begin{cases} x_{1}^{'}=u-x_{1}\\ x_{2}^{'}=u-2x_{2}\\ x_{3}^{'}=u-4x_{3}\\ y=\frac{4}{3}x_{1}-x_{2}-\frac{1}{3}x_{3} \end{cases}

Function f1(x1, x2, x3, x4, t As Single)
f1 = 1 - x1
End Function

Function f2(x1, x2, x3, x4, t As Single)
f2 = 1 - 2 * x2
End Function

Function f3(x1, x2, x3, x4, t As Single)
f3 = 1 - 4 * x3
End Function

Function f4(x1, x2, x3, x4, t As Single)
f4 = 4 / 3 * x1 - x2 - 1 / 3 * x3
End Function

5.运行验证

令u=1,即上述子函数中的“1”。

级联结果

串联结果

并联结果

 三种方法所得结果相似,侧面证明程序编写正确。

读者可以验证u=t时的不同结果

总结

当遇到写代码无从下手时,可以考虑查询相关算法的例程,相互对照进行借鉴。例如我在其他帖子上看到了用四阶龙格库塔法求一阶微分方程的例子,只有一个未知数,所以用一次5个公式就好了。而本例有4个未知数,所以用5*4=20个公式,以此类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值