基于龙格库塔法的电路仿真.docx
《基于龙格库塔法的电路仿真.docx》由会员分享,可在线阅读,更多相关《基于龙格库塔法的电路仿真.docx(46页珍藏版)》请在冰豆网上搜索。
基于龙格库塔法的电路仿真
本科毕业论文(设计、创作)
题目:
基于龙格-库塔法的电路仿真
学生姓名:
杨从锋学号:
**********
所在系院:
信息与通信技术系专业:
电子信息工程
入学时间:
2010年9月
导师姓名:
傅有亮//朱亮职称/学位:
副教授/硕士//讲师/硕士
导师所在单位:
完成时间:
2014年5月
安徽三联学院教务处制
基于龙格-库塔法的电路仿真
摘要:
在工程领域中,连续系统是种比较常见的系统,对应的方针方法也是系统仿真技术中最基本、最常见、最成熟的技术。
进行数字仿真首先要建立次仿真系统的数学模型,并将此模型转换为计算机可接受的、与模型等价的仿真模型,最后编制仿真程序,并在计算机上运行。
如何将连续系统的模型转换成等价的计算机仿真模型,采用什么方法解决此仿真模型,这就是连续数字仿真算法所要解决的问题。
关于连续系统的数学模型,大多数情况下可以用微分方程的形式给出,因此连续系统仿真算法大多也可以归结为计算机求解微分方程的问题。
本文将研究龙格-库塔数值积分法的电路仿真模型。
关键词:
连续系统,数字仿真,微分方程,龙格库塔数值积分
CircuitsimulationbasedonRungeKuttamethod
Abstract:
Rontinuoussystemismorecommon,thepolicysimulationtechnologyisthemostbasicsystemexposure,themostcommon,themostmatureintheengineeringfield.Thedigitalsimulationmathematicalmodelshouldbeestablishedforsimulationsystem,themodelisconvertedintothesimulationmodelofcomputeracceptable,andtheequivalenceofthemodels,andthenthesimulationprogram,andrunonyourcomputer.Howwillthecontinuoussystemmodelintoacomputersimulationmodelofequivalent,whichmethodisadoptedtosolvethismodel,whichisthecontinuousdigitalsimulationalgorithmtosolvetheproblem.Themathematicalmodelofcontinuoussystem,mostcanbegivenbytheformofdifferentialequations,thereforecontinuoussystemsimulationalgorithmscanbereducedtotheproblemofsolvingdifferentialequationsofthecomputer.Circuitsimulationmodel.ThispaperwillstudythenumericalRungeKuttaintegrationmethod.
Keywords:
continuoussystem;digitalsimulation;differentialequation;theRungeKuttanumericalintegration
3.1.1连续系统仿真3
3.1.2离散事件系统仿真3
4.2.3程序运行结果12
第一章引言
数值计算主要研究在实际问题中利用计算机如何更好的去解决各种数学上的问题,包括连续系统离散化的求解和离散型方程的求解,并考虑误差,收敛性以及稳定性等问题。
连续系统是指系统的状态变量随着时间连续变化的系统,其主要特征可以通过常微分方程或偏微分方程进行描述。
其中常微分方程描述的系统被称为集中参数系统,他的数学模型常是一组常微分方程,系统一般包括各种电路,动力学和种群生态系统。
而偏微分方程通常描述的系统则称为分布参数系统,他的数学模型常是一组偏微分方程,系统一般包括工程领域内的对流扩散系统和物理领域内的流体系统等等。
数学类型上,数值运算包括最优化方法,数值代数,数值逼近,数值微分和数值积分,积分方程数值的解发,常微分方程数值的解法,偏微分方程数值的解法,概率统计,计算机和等的研究。
微分方程的建模方法是研究函数变化规律的重要工具,在科技,经济管理,生态,环境,人口,交通等各个领域上都有着广泛的应用。
随着计算机应用的发展产生了许多计算领域的问题。
在工作中,连续系统的仿真方法是系统仿真技术中最基本,最常用,最成熟的。
如何将连续系统的数学模型转换成计算机可以接受的等价的仿真模型,采用何种方法在计算机上求解此模型,这是连续系统数字仿真算法所要解决的问题。
建立微分方程模型只是初步解决问题,实际上通常要求出方程的解来解释实际现象,并进一步的检验。
能得到解析形式的解固然方便分析和应用,但很多微分方程是解不出的,故对其研究稳定性和数值解法也非常重要。
第二章VC++6.0的简介
VisualC++6.0,简称VC或VC6.0,是微软公司推出的一款C++编译器,将“高级语言”翻译成“机器语言”程序。
VisualC++是一个功能强大的可视化的软件开发工具。
自1993年Microsoft公司推出的VisualC++1.0后,随着新版本的不断问世,VisualC++已成为专业的程序员进行软件开发首选的工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用有很大的局限性,只适用于Windows2000、WindowsXP和WindowsNT4.0。
所以在实际问题中,更多以VisualC++6.0为平台。
VisualC++6.0不但是C++ 编译器,而且是基于Windows操作系统的可视化集成开发环境(IDE)。
VisualC++6.0是由许多组件组成的,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等工具。
这些组件通过DeveloperStudio的组件集成一个和谐的开发环境。
第三章计算机仿真
3.1什么是计算机仿真
随着信息技术和计算机技术的发展,“仿真”的概念也在不断的发展和完善,因此给予仿真一个确定的定义是非常困难的。
通俗所说的系统仿真基本含义是:
设计一个实际系统的模型,对它进行实验,以便于对它理解和评价系统的各种运行的一种策略。
而这里的模型是一个广义的模型,包含数学模型、非数学模型、物理模型等等。
显而易见,根据模型的不同,有着不同方式的仿真。
从仿真实现的角度来看,模型特性可以分为连续系统和离散事件系统两大类
。
3.1.1连续系统仿真
连续系统仿真指的是物理系统状态随着时间连续变化的系统,一般可以使用常微分方程或偏微分方程组来描述。
而这类系统也包括用差分方程描述的离散时间系统。
3.1.2离散事件系统仿真
离散事件系统指的是物理系统的状态在某些随机的时间点上发生离散变化的系统。
它与连续系统的主要区别在于:
物理状态的变化发生在随机时间点上,这种引起状态变化的行为被称作“事件”,因而这类系统是由事件驱动的。
离散时间系统的事件往往发生在随机时间点上,并且事件是时间的离散变量。
系统的动态特性是无法使用微分方程这类数学方程来描述的,只能使用事件的活动图或是流程图。
因此对离散事件系统的仿真的主要目的是对系统事件的行为作统计特性的分析,而不是对物理系统的状态轨迹作出分析。
3.2系统与系统模型
3.2.1系统
系统是一些具有特定功能的、相互之间以一定规律联系的物体所组成的一个总体。
系统是一个广泛的概念,它在现代科学研究中扮演着重要的角色。
不同领域的问题都可以用系统来解决。
有的系统非常复杂,有的却很简单,因此给“系统”下一个确切的定义是非常困难的。
因为这个定义不但要能够概括系统的各种应用,又要足以简明地把这个定义应用于实际问题当中。
但所有的系统均具有4个重要的性质:
整体性、相关性、有序性和动态性。
建立系统概念的目的是为了深入的认识并掌握系统运动规律。
因此不仅要定性的了解系统,还要定量的分析、综合系统。
定量地的分析、综合系统最有效手段是建立系统模型,并使用高效的数值计算工具和算法对系统模型进行解算。
3.2.2系统模型
系统模型指的是以某种确定的形式(如文字、符号、图表、数学公式等),对系统某一方面本质进行属性上的描述。
一方面,根据不同的研究目的,对同一个系统可以建立不同的系统模型。
另一方面,同一系统模型也可代表着不同的系统。
系统模型的特征有以下三个:
(1)它是现实系统的抽象体或模仿体;
(2)它是由反映系统本质或特征的主要因素构成的;
(3)它集中的体现了这些主要因素之间的相互关系。
1.系统模型的分类
常用的系统模型通常上分为物理模型、文字模型和数学模型三类,其中物理模型与数学模型又可以分为若干种。
而在所有系统模型中,通常采用数学模型来分析系统工程问题,其原因在于:
(1)它是定量分析的基础;
(2)它是系统预测和决策的工具;
(3)它可变性好,适应性强,分析问题的速度快,且便于应用于计算机。
2.系统建模的要求、遵循原则和方法
系统建模的要求可概括为:
现实、简明、标准。
系统建模的遵循原则是:
1切题;2模型结构清晰;3精度适当;4尽量使用标准模型。
根据系统的对象不同,则系统建模的方法可分为推理法、统计分析法、实验法、混合法和类似法。
根据系统的特性不同,则系统建模的方法可以分为状态空间法、结构模型解析法和最小二乘估计法等。
3.3计算机仿真的具体实施
在开展系统的仿真工作之前,必须对所研究的系统做详细的调查和了解,明确所要研究的问题和研究的目标,以及描述这些目标的主要参数和衡量标准。
同时要清晰地定义所研究系统的范围和边界。
但需注意,该范围和边界一定要定义得恰当,不能希望什么问题都一次解决,但也应避免问题的过分细化。
一般连续系统仿真所需研究的问题可概括为以下几个内容:
方案论证:
对设计的方案进行论证,或是对系统进行鉴定论证。
系统分析:
对已存在系统进行研究,或对系统故障进行仿真分析。
辅助建立系统模型,选择合理的结构,优化设计参数。
半实物实验:
将系统的某一子部分接入计算机仿真系统,检验实际设计﹑加工效果。
图1是仿真的流程图。
图1.仿真的流程图
第四章龙格-库塔数值积分法的电路仿真
4.1龙格-库塔数值积分法
4.1.1龙格-库塔数值积分法的基本简介
将展开式
多取几项以后截断,就可以得到精度较高的高阶数值解,但是要直接使用台劳展开式要计算函数的高阶导数。
龙格—库塔法是间接的利用台劳展开式,即用在n个点上的函数值f的线性组合来代替f的导数,然后按台劳展开式确定其中的系数,以提高算法的阶数。
这样既能有效的避免计算函数的导数,同时又能保证计算的精度。
因为龙格—库塔法具有很多优点,所以在许多仿真程序中,它是最基本的算法之一。
4.1.2龙格-库塔数值积分法的分析方法
已知y(t0)=y0,假设我t0开始以h增长,t1=t0+h,t1时刻为
在
附近展开成台劳级数,保留
项,则有
(4-1)
上式括号内下标为0,表示括号中的函数用t=t0,y=y0代入,以下均同。
假定上式的解可写成如下形式
(4-2)
其中,K1=f(t0,y0)
对K2式右端的函数在t=t0,y=y0处展开成台劳级数,保留h项,可得到:
将K1与K2代入(4-2)式得:
将上式与(4-2)式比较,可得系数a1,b1,c2,b2方程如下:
以上三个方程,四个未知数,因此有无穷个解,若设b1=b2则可得一个解:
将它们代入(4-2)式可得出一组计算公式
其中K1=f(t0,y0),k2=f(t0+h,y0+k1h),写成一般的递推形式如下:
(4-3)
其中,
式中只取h,
两项,而将
以上的高阶项舍去,一次地推公式的截断误差与h的三次方成正比,计算的过程只取h和h的平方,因此这种方法被称为二阶龙格库塔法。
而我们一般使用的是四阶的龙格库塔公式,在展开的台劳数中保留
,
,
和
项,它的截断误差是
,四阶龙格库塔公式如下:
(4-4)
式中:
四阶龙格—库塔法公式精度较高,故其普遍应用于各个地方。
4.2用VC++6.0进行系统编程
4.2.1建模
本文对图2的一阶电路响应方程进行仿真。
图2.一阶RC放电电路
+Uc=0Uc(0)为初始条件
+
Uc=0Uc(0)=10V
初始状态方程D
=-P
*Y
运行程序时需输入数据:
dtptdtmaxt仿真步长,打印步长,仿真总经时
NMVW方程数目
Y[1]Uc
变量初始条件
4.2.2龙格库塔法程序设计
#include"stdio.h"
#include"conio.h"
#include"math.h"/*标准的输入输出流头文件*/
#defineNORDER3
#defineNPARAM2
floaty[NORDER],d[NORDER],p[NPARAM],t;
voidoutput(void)
{intj;
printf("%9s","time");
for(j=0;jprintf("y[%d]",j);
putchar('\n');
}
voiddifq(void)
{d[0]=-p[0]*y[0]*y[1];
d[1]=p[0]*y[0]*y[1]-p[1]*y[1];
d[2]=p[1]*y[1];
}
voidrun(floatdt)
{inti;
floatrk[3][NORDER],ys[NORDER];
difq();
for(i=0;i{rk[0][i]=d[i]*0.5*dt;
ys[i]=y[i];
y[i]=ys[i]+rk[0][i];
}
t+=0.5*dt;
difq();
for(i=0;i{rk[1][i]=d[i]*0.5*dt;
y[i]=ys[i]+rk[1][i];
}
difq();
for(i=0;i{rk[2][i]=d[i]*dt;
y[i]=ys[i]+rk[2][i];
}
t+=0.5*dt;
difq();
for(i=0;iy[i]=ys[i]+1.0/6*(2*(rk[0][i]+rk[2][i])+4*rk[1][i]+d[i]*dt);
}
voidmain(void)
{charc;
do
{floatdt,tmax,co,tnext,tol;
intj;
printf("Thisprogramwillfindtherootof:
\n");
printf("{y[0]'(t)=-p[0]*y[0]*y[1]\n");
printf("&&{y[1]'(t)=p[0]*y[0]*y[1]-p[1]*y[1]\n");
printf("&&{y[2]'(t)=p[1]*y[1]\n");
for(j=0;j{printf("Now,pleaseinputthefirsty[%d]:
",j);
scanf("%f",&y[j]);
}
for(j=0;j{printf("Pleaseinputp[%d]:
",j);
scanf("%f",&p[j]);
}
printf("Pleaseinputthetimeofsimulation:
");
scanf("%f",&tmax);
printf("Pleaseinputthetimeofonestep:
");
scanf("%f",&dt);
printf("Now,thisistheresult:
\n");
co=5*dt;
tol=0.0001*co;
tnext=0;
output();
for(t=0;t<=tmax+tol;)
{intk;
if(fabs(tnext-t){tnext+=co;
printf("%10.4f",t);
for(k=0;kprintf("%10d",(int)(y[k]+0.5));
putchar('\n');
}
run(dt);
}
printf("\nRunthisprogramagain[Y]:
");
c=getche();
putchar('\n');
}
while(c=='\r'||c=='Y'||c=='y');
}
程序中所用的变量和数组说明如下:
Y(20)状态变量数组
G(20)状态变量的一阶导数
P(20)存数系统参数,本例中仅一个参数,P
(1)=P1=0.1
TMAX模拟时间
DT积分步长,即前面的h
NP打印点数
NORDER系统阶数
NPARAM系统参数个数
OUTPUT打印输出控制变量,.TRUE.为打印FALSE
为不打印
INIT打印表头控制变量
A(8)8个参数变量
CO打印时间间隔
NOUT已打印点数计数器
TNEXT打印点处的时间值
SS剩下的打印点数
NLIST输出结果
}
4.2.3程序运行结果
通过改变
分别为0.05、0.10、0.15,仿真结果如表1所示。
表1.根据上面所给参数的仿真结果
0.2
9.65581
0.4
9.32348
0.6
9.00257
0.8
8.69272
1
8.39353
1.2
8.10464
1.4
7.82569
1.6
7.55634
1.8
7.29626
2
7.04513
2.2
6.80265
2.4
6.56851
2.6
6.34243
2.8
6.12414
3
5.91335
3.2
5.70982
3.4
5.5133
3.6
5.32354
3.8
5.14031
4
4.96335
4.2
4.79256
4.4
4.6276
4.6
4.46833
4.8
4.31453
5
4.16603
5.2
4.02265
5.4
3.88419
5.6
3.7505
5.8
3.62142
6
3.49677
6.2
3.37624
6.4
3.26021
6.6
3.148
6.8
3.03965
7
2.93503
7.2
2.83401
7.4
2.73646
7.6
2.64228
7.8
2.55134
8
2.46352
8.2
2.37873
8.4
2.29686
8.6
2.2178
8.8
2.14147
9
2.06776
9.2
1.9966
9.4
1.92788
9.6
1.86152
9.8
1.79745
10
1.73558
10.2
1.67585
10.4
1.61817
10.6
1.56247
10.8
1.50869
11
1.45677
11.2
1.40663
11.4
1.35821
11.6
1.31147
11.8
1.26633
12
1.22274
12.2
1.18066
12.4
1.14002
12.6
1.10078
12.8
1.0629
13
1.02631
13.2
0.99099
13.4
0.95688
13.6
0.92395
13.8
0.89214
14
0.86144
14.2
0.83179
14.4
0.80316
14.6
0.77552
14.8
0.74882
15
0.72305
15.2
0.69816
15.4
0.67415
15.6
0.65093
15.8
0.62853
16
0.60689
16.2
0.58601
16.4
0.56584
16.6
0.54636
16.8
0.52756
17
0.5094
17.2
0.49187
17.4
0.47494
17.6
0.45859
17.8
0.44281
18
0.42757
18.2
0.41285
18.4
0.39864
18.6
0.38429
18.8
0.37167
19
0.35888
19.2
0.34653
19.4
0.3346
19.6
0.32308
19.8
0.31196
20
0.30123
20.2
0.29086
20.4
0.28085
20.6
0.27118
20.8
0.26185
21
0.25283
21.2
0.24413
21.4
0.23573
21.6
0.22762
21.8
0.21978
22
0.21222
22.2
0.20491
22.4
0.19786
22.6
0.19105
22.8
0.18447
23
0.17813
23.2
0.17199
23.4
0.16607
23.6
0.16036
23.8
0.15484
24
0.14951
24.2
0.14436
24.4
0.1384
24.6
0.1346
24.8
0.12996
25
0.12549
25.2
0.12117
25.4
0.117
25.6
0.11297
25.8
0.10909
26
0.10533
26.2
0.10171
26.4
0.09821
26.6
0.09483
26.8
0.09156
27
0.08841
27.2
0.08537
27.4
0.08243
27.6
0.07959
27.8
0.07685
28
0.07421
28.2
0.07165
28.4
0.06919
28.6
0.06681
28.8
0.06451
29
0.06229
29.2
0.060