- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
XUEHAO-XINGMING-运用数值分析法求解一元非线性电路方程
运用数值分析法求解一元非线性电路方程任** 5******** F******摘要在电路基础的课程中,非线性电阻电路是一块比较重要的内容。在这门课程的教材中,介绍了四种分析非线性电阻电路的方法。其中一种是数值分析法。在本文中,我主要利用牛顿法分析非线性电阻电路,并通过逼近法求一元非线性电路方程的解。由于专业的相关性,本文尝试通过C++编程语言来辅助计算,使得分析求解更为简便。关键字牛顿法、非线性电阻电路方程求解、C++编程正文基本理论:求解非线性电阻电路方程,可以采用数值分析法。数值分析法(numerical analysis)一般采用逼近的方法,使迭代的点序列逐步逼近线性方程的解。在本文中,主要采用牛顿法求解电路方程。牛顿法最初由艾萨克·牛顿于1736年在 Method of Fluxions 中公开提出。而事实上方法此时已经由Joseph Raphson于1690年在Analysis Aequationum中提出,与牛顿法相关的章节《流数法》在更早的1671年已经完成了。含有一个非线性电阻电路方程,最终可归结为一个一元非线性方程,假设电路方程的形式为 f(x) = 0 (1.1)式子中,x为待求解的电路变量,一般为电压或电流。求解非线性方程解的牛顿法,是基于围绕某一近似解x(k)对函数f(x)进行泰勒展开给出的,即f(x)=f(x(k))+ |x= x(k) ·(x - x(k))+|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)的解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 用牛顿法逼近求解实际进行计算时,可以选取合适的初始值x(0),由式子1.4计算得到x(1),依此反复迭代,直至|x(k+1)- x(0)| ≤ε, ε称为收敛精度,是一个非常小的正实数,如10-5等。此时x(k+1)可以作为非线性方程的解。实际应用中的困难:运用牛顿法逼近求解一元非线性方程是一种很不错的方法,但是在实际运用中,由于原函数f(x)的一阶导数十分复杂,使得每一次的迭代过程变得繁琐,计算量可能会很大美妙的学习过程此时就会演变成一种痛苦的计算过程,稍一疏忽计算错误,还可能前功尽弃。C++编程辅助的引入:这个问题使我在学习中感到比较困惑。虽然牛顿法简便易懂,可是在平时的学习过程中我困于繁琐的计算,将更多的精力花在了求导、已经后续的迭代计算上,为了得到更为精确的解,往往要迭代数次,让我们无法真正地体会到电路的美感。因此,我们结合本专业特点,联想到如此繁琐的计算过程是否可以通过设计简单的程序,并交给计算机来完成求解呢?于是,我决定使用C++语言,来帮我实现这个想法。寥寥几个语句让人摆脱了繁杂计算的枷锁。下面根据课上所学电路知识,以及对牛顿法的基本理解,设计了实现这个算法的伪代码:Newton_method(){while(1){x(k+1)=x(k)+f(x(k))/( |x= x(k));if (|x(k+1)- x(0)| ≤ε) break;}}举例:下面试举一例来验证计算机C++程序下强大的计算能力。书P217例4.6.1:用牛顿法求解图1.3所示电路的电压u2和电流i2,其中iS=0.673A,二极管的电压—电流关系为:i2 = 0.1(-1)A。(其中i2为二极管所在支路电流,u2为二极管)图1.3 例4.6.1图解: 由电路方程可得KCL方程is = i1 + i2将i1= u2和i2 = 0.1(-1)代入并整理,得到以u2为变量的非线性电路方程f(u2) = 0.1(-1)+ u2 - 0.673 = 0对f(u2)求导,得 = 4+2.5因此,牛顿法的迭代公式为u2(k+1) = u2(k) - 式中,上标表示迭代次数。取初始值u2 = 0时的迭代结果为u2 = 0.047 V将u2 的数值代入式 i2 = 0.1(-1)A,可得i2 = 0.555 A解毕。C++程序实现:// Newton_method.cpp : //#i
文档评论(0)