您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > XUEHAO-XINGMING-运用数值分析法求解一元非线性电路方程
运用数值分析法求解一元非线性电路方程-1-运用数值分析法求解一元非线性电路方程任**5********F******摘要在电路基础的课程中,非线性电阻电路是一块比较重要的内容。在这门课程的教材中,介绍了四种分析非线性电阻电路的方法。其中一种是数值分析法。在本文中,我主要利用牛顿法分析非线性电阻电路,并通过逼近法求一元非线性电路方程的解。由于专业的相关性,本文尝试通过C++编程语言来辅助计算,使得分析求解更为简便。关键字牛顿法、非线性电阻电路方程求解、C++编程正文1.基本理论:求解非线性电阻电路方程,可以采用数值分析法。数值分析法(numericalanalysis)一般采用逼近的方法,使迭代的点序列逐步逼近线性方程的解。在本文中,主要采用牛顿法求解电路方程。牛顿法最初由艾萨克·牛顿于1736年在MethodofFluxions中公开提出。而事实上方法此时已经由JosephRaphson于1690年在AnalysisAequationum中提出,与牛顿法相关的章节《流数法》在更早的1671年已经完成了。含有一个非线性电阻电路方程,最终可归结为一个一元非线性方程,假设电路方程的形式为f(x)=0(1.1)式子中,x为待求解的电路变量,一般为电压或电流。求解非线性方程解的牛顿法,是基于围绕某一近似解x(k)对函数f(x)进行泰勒展开给出的,即f(x)=f(x(k))+𝑑𝑓𝑑𝑥|x=x(k)·(x-x(k))+12d2𝑓ⅆ𝑥2|x=x(k)·(x-x(k))2+……(1.2)如果x–x(k)很小,则可取一阶近似,得到f(x)=0≈f(x(k))+𝑑𝑓𝑑𝑥|x=x(k)·(x–x(k))(1.3)这是一个线性方程,记其解为x(k+1),则有x(k+1)=x(k)+f(x(k))/(𝑑𝑓𝑑𝑥|x=x(k))(1.4)式(1.2)就是牛顿法的迭代公式。牛顿法具有明确的几何解释。式(1.1)的解运用数值分析法求解一元非线性电路方程-2-x*可解释为曲线y=f(x)与x轴的交点的横坐标,见图1.1。图1.1牛顿法求实根图示设x(k)是x*的某个近似值,过曲线y=f(x)上横坐标为x(k)的点Pk作切线,并将该切线与x轴的交点横坐标x(k+1)作为x*的新的近似值。注意到切线方程为y=f(x(k))+𝑑𝑓𝑑𝑥|x=x(k)(x–x(k))(1.5)这样求得的值x(k+1)必然满足式子1.2.由于这种几何背景,牛顿法也称为切线法。图1.2用牛顿法逼近求解运用数值分析法求解一元非线性电路方程-3-实际进行计算时,可以选取合适的初始值x(0),由式子1.4计算得到x(1),依此反复迭代,直至|x(k+1)-x(0)|≤ε,ε称为收敛精度,是一个非常小的正实数,如10-5等。此时x(k+1)可以作为非线性方程的解。2.实际应用中的困难:运用牛顿法逼近求解一元非线性方程是一种很不错的方法,但是在实际运用中,由于原函数f(x)的一阶导数十分复杂,使得每一次的迭代过程变得繁琐,计算量可能会很大美妙的学习过程此时就会演变成一种痛苦的计算过程,稍一疏忽计算错误,还可能前功尽弃。3.C++编程辅助的引入:这个问题使我在学习中感到比较困惑。虽然牛顿法简便易懂,可是在平时的学习过程中我困于繁琐的计算,将更多的精力花在了求导、已经后续的迭代计算上,为了得到更为精确的解,往往要迭代数次,让我们无法真正地体会到电路的美感。因此,我们结合本专业特点,联想到如此繁琐的计算过程是否可以通过设计简单的程序,并交给计算机来完成求解呢?于是,我决定使用C++语言,来帮我实现这个想法。寥寥几个语句让人摆脱了繁杂计算的枷锁。下面根据课上所学电路知识,以及对牛顿法的基本理解,设计了实现这个算法的伪代码:Newton_method(){while(1){x(k+1)=x(k)+f(x(k))/(𝑑𝑓𝑑𝑥|x=x(k));if(|x(k+1)-x(0)|≤ε)break;}}4.举例:下面试举一例来验证计算机C++程序下强大的计算能力。书P217例4.6.1:用牛顿法求解图1.3所示电路的电压u2和电流i2,其中iS=0.673A,二极管的电压—电流关系为:i2=0.1(-1)A。(其中i2为二极管所在支路电流,u2为二极管)运用数值分析法求解一元非线性电路方程-4-图1.3例4.6.1图解:由电路方程可得KCL方程is=i1+i2将i1=10.4u2和i2=0.1(-1)代入并整理,得到以u2为变量的非线性电路方程f(u2)=0.1(-1)+10.4u2-0.673=0对f(u2)求导,得𝑑𝑓()𝑑=4+2.5因此,牛顿法的迭代公式为u2(k+1)=u2(k)-1()2()()2式中,上标表示迭代次数。取初始值u2=0时的迭代结果为u2=0.047V将u2的数值代入式i2=0.1(-1)A,可得i2=0.555A解毕。C++程序实现://Newton_method.cpp://#includestdafx.h#includeiostream#includecmathusingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){floate=0.0001;coutThisistheNewtonMethodappliedincircuitequations!(SupportedbyC++)endl;coutPleaseinputtheoriginalu2:;doubleu=0,v=0;cinu;intp=0;while(1){运用数值分析法求解一元非线性电路方程-5-//for(inti=0;i4;i++){v=u;u=u-(0.1*exp(40*u)+2.5*u-0.773)/(4*exp(40*u)+2.5);if(abs(u-v)e)break;p=p+1;}coutThesolutionisu2=u!endl;coutTimes:pendl;system(PAUSE);return0;}//(RuninVS2010)运行结果:ThisistheNewtonMethodappliedincircuitequations!(SupportedbyC++)Pleaseinputtheoriginalu2:0Thesolutionisu2=0.0470052!请按任意键继续...图1.4C++程序实现结果窗口运用数值分析法求解一元非线性电路方程-6-5.分析和总结:经过C++程序辅助计算可知,书中提供的解法至少迭代了5次或以上,因为,u2(4)=0.0504981;u2(5)=0.0472204,迭代的次数越多,答案越趋近于一个稳定值,在这道题中,经过足够多次数的迭代,u2(k)=0.0470052,比书中提供的解答更加接近真实答案。此外,实验表明,经过数十次的迭代计算机仅需不到一秒的时间内便可以完成。通过上面的列举分析,我们可以明显地看到通过C++程序支持的计算机所具有的强大计算能力,并且整个程序十分简洁明了且易于修改和维护。有了C++程序辅助计算,我们可以轻松地通过牛顿迭代法求得真实值,无论是在解决平时的问题中,还是在今后利用牛顿法解决更加深奥的问题时,都给我们带来很多方便,也具有实际意义。对于ε,在C++程序中(floate=0.0001;)以e来代替。e的数量级决定了所求得的答案的精确程度和迭代的次数。e越小,所求得的答案的精确程度越高,迭代次数也越多。另外,对于初始值u2的选取也比较有讲究。当初始值u2=0时,仅需迭代6次即可求得答案0.0472204;当初始值u2=1时,需要迭代41次得到结果;当初始值u2=1时,需要迭代81次得到结果;当初始值u2=10时,需要迭代401次得到结果;当初始值u2=20时,计算机在3分钟内仍然没有给出结果。可见,初始值的设置对于问题的求解起着至关重要的作用。对于初始值的设定,首先我们应该估计结果大致的区间范围,并尽可能给出接近的值,这样可以减少迭代的次数,也可以节约计算的时间。6.思考与感想:牛顿法不仅可以应用在解决非线性电路方程上,也可以应用到所有的一元非线性方程中。牛顿法在理工学的计算中有着很广泛的应用。在本学期电路基础课程的学习中,我们不仅对电路的相关知识有了一定的了解,同时也学习掌握了一些普适的解决问题办法,除了牛顿法之外,如拉普拉斯变换,一阶RC电路的振荡频率等等,它们在其他领域也有着广泛的应用。因此,电路基础课程的学习是一种融会贯通的过程,它带给我们的受益不仅仅在于电路上,而是更多。致谢乔老师课上严谨而富有启发性的教学让人受益颇多,在此表示衷心感谢!运用数值分析法求解一元非线性电路方程-7-参考文献1.陈洪亮张峰田社平电路基础【M】.北京:高等教育出版社,2008。2.牛顿法——wikipedia
本文标题:XUEHAO-XINGMING-运用数值分析法求解一元非线性电路方程
链接地址:https://www.777doc.com/doc-2868251 .html