《非线性方程求解优秀课件.ppt》由会员分享,可在线阅读,更多相关《非线性方程求解优秀课件.ppt(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、非线性方程求解第1页,本讲稿共32页4.1 化工实际问题的提出化工实际问题的提出求解非线性方程是化工设计及模拟计算中必须解决的一个问题。与线性方程相比,非线性方程问题无论是从理论上还是从计算公式上,都要比线性方程复杂的多。对于一般的非线性f(x)=0,计算方程的根既无一定章程可循也无直接方法可言。例如,求解高次方程组7x6-x3+x-1.5=0的根,求解含有指数和正弦函数的超越方程ex-sin(x)=0的零点。解非线性方程或非线性方程组也是计算方法中的一个主题。一般地,我们用符号f(x)来表示方程左端的函数,方程的一般形式表示为f(x)=0,方程的解称为方程的根或函数的零点。通常,非线性方程的
2、根不止一个,而任何一种方法只能算出一个根。因此,在求解非线性方程时,要给定初始值或求解范围。而对于具体的化工问题,初值和求解范围常常可根据具体的化工知识来决定。常见的雷诺数和摩擦系数关系方程在雷诺数低于4000时有以下关系式:(4-1)4.14.84.74.54.34.2总目录总目录4.94.64.4第2页,本讲稿共32页4.1 化工实际问题的提出化工实际问题的提出这是一个典型的非线性方程。我们在管路设计中经常碰到。当我们已知雷诺数Re,如何根据公式(4-1)求出摩擦系数,这是我们在管路设计中必须首先解决的问题。对于方程(4-1)而言,无法用解析的方法求出摩擦系数,只能用数值求解的方法。如用在
3、下面即将介绍的松弛迭代法,假设:则利用松弛迭代公式可得:经11次迭代可得摩擦系数为0.07593。同样,在n个组分的等温闪蒸计算中,通过物料和相平衡计算,我们可得到如下非线性方程:4.14.84.74.54.34.2总目录总目录4.94.64.4第3页,本讲稿共32页4.1 化工实际问题的提出化工实际问题的提出在方程(4-3)中只有是未知数,ki为相平衡常数,zi为进料组分的摩尔浓度,均为已知数。和上面的情况一样,方程(4-3)也无法直接解析求解,必须利用数值的方法,借助于计算机方可精确的计算。对于这个问题的求解,可利用我们下面介绍的牛顿迭代法进行计算,也可利用其他迭代公式进行计算,如采用牛顿
4、迭代公式,则可以得到如下的具体迭代公式:(4-4)饱和蒸气压是我们经常要用到的数据,虽然我们可以通过实验测量来获取饱和蒸气压的数据,但我们通常利用前人已经测量得到的数据或回归的公式来获取,这可以减轻我们大量的基础实验工作。公式(4-5)是一种常用的饱和蒸气压计算公式:(4-5)其中p为饱和蒸气压,单位为mmHg,T为温度,单位为K,A、B、C、D为已知系数。要想得到某一温度下的饱和蒸气压,直接利用公式(4-5)是无法得到的。因为公式(4-5)两边都有未知变量,并且无法用解析的方法求解,必须用数值计算的方法求解。通过上面的一些例子,我们可以发现,如果没有适当的手段和办法来求解非线性方程,那么化学
5、化工中的许多研究、设计等工作将无法展开,这势必影响化学化工的发展,下面我们将介绍一些实用的非线性方程求解方法,并提供计算机程序。4.14.84.74.54.34.2总目录总目录4.94.64.4第4页,本讲稿共32页4.2 实根的对分法实根的对分法4.2.1 使用对分法的条件使用对分法的条件 4.2.2对分法求根算法对分法求根算法 4.2.3对分法对分法VB程序清单程序清单 4.14.84.74.54.34.2总目录总目录4.94.64.4第5页,本讲稿共32页4.2.1 使用对分法的条件使用对分法的条件对分法或称二分法是求方程近似解的一种简单直观的方法。设函数f(x)在a,b上连续,且f(a
6、)f(b)0,则f(x)在a,b上至少有一零点,这是微积分中的介值定理,也是使用对分法的前提条件。计算中通过对分区间,逐步缩小区间范围的步骤搜索零点的位置。如果我们所要求解的方程从物理意义上来讲确实存在实根,但又不满足f(a)f(b)0,这时,我们必须通过改变a和b的值来满足二分法的应用条件。4.14.84.74.54.34.2总目录总目录4.94.64.4第6页,本讲稿共32页4.2.2对分法求根算法对分法求根算法计算f(x)=0的一般计算步骤如下:1、输入求根区间a,b和误差控制量,定义函数f(x)。2、判断:如果f(a)f(b)0则转下,否则,重新输入a和b的值。3、计算中点x=(a+b
7、)/2以及f(x)的值 分情况处理分情况处理(1)|f(x)|:停止计算x*=x,转向步骤4(2)f(a)f(x)0:修正区间a,xa,b,重复3(3)f(x)f(b)0:修正区间x,ba,b,重复3 4、输出近似根x*。右图给出对分法的示意图。x3=(x0+x2)/2 x2=(x0+x1)/2 x0 x3 x1 x1 4.14.84.74.54.34.2总目录总目录4.94.64.4第7页,本讲稿共32页4.2.3对分法对分法VB程序清单程序清单Private Sub Command1_Click()Dim x1,x2,x,y1,y2,y,eer80 x1=InputBox(x1)x2=In
8、putBox(x2)eer=inputbox(“eer”)y1=f(x1)y2=f(x2)If y1*y2 0 Then GoTo 100Else Print please repeat input x1 and x2 GoTo 80End If100 x=(x1+x2)/2y=f(x)If Abs(y)=0.001 Then Print the function root is;x Print y=;yElse If y1*y 0 Then x2=x y2=y GoTo 100 Else x1=x y1=y GoTo 100 End IfEnd IfEnd SubPublic Functio
9、n f(x)Dim yy=x 3+x 2-1f=yEnd Function 4.14.84.74.54.34.2总目录总目录4.94.64.4第8页,本讲稿共32页4.2.3对分法求解实例对分法求解实例用对分法求在区间1,2之间的根。解:(1)f(1)=-2.8,f(2)=0.3,由介值定理可得有根区间a,b=1,2。(2)计算x2=(1+2)/2=1.5,f(1.5)=-0.45,有根区间a,b=1.5,2。(3)计算x3=(1.5+2)/2=1.75,f(1.75)=0.078125,有根区间a,b=1.5,1.75。一直做到|f(xn)|(计算前给定的精度)或|a-b|时停止。详细计算结
10、果见表4-1。对分法的算法简单,然而,若f(x)在a,b上有几个零点时,如不作特殊处理只能算出其中一个零点;另一方面,即使f(x)在a,b上有零点,也未必有f(a)f(b)0。这就限制了对分法的使用范围。对分法只能计算方程f(x)=0的实根。对于多个零点的方程,我们可以通过将给定的区间a,b进行细分,然后在细分后的区间内用二分法分别求解,从而得到多个零点。例如求方程在0-30内的所有根。需要对二分法进行以下处理:即先给定一个a,本例中为0,然后不断增加,直到找到一个b,使f(a)f(b)0,调用二分法,计算在a,b范围内的根,然后将b作为a,重复上面的工作,直到计算范围超出30为止。4.14.
11、84.74.54.34.2总目录总目录4.94.64.4VB调用调用第9页,本讲稿共32页4.3直接迭代法直接迭代法对给定的方程f(x)=0,将它转换成等价形式:。给定初值x0,由此来构造迭代序列,k=1,2,,如果迭代收敛,即 有 ,则就是方程f(x)=0的根。在计算中当 小于给定的精度控制量时,取 为方程的根。例如,代数方程x3-2x-10=0的三种等价形式及其迭代格式如下:对于方程构造的多种迭代格式,怎样判断构造的迭代格式是否收敛?收敛是否与迭代的初值有关?根据数学知识,我们可以直接利用以下收敛条件:1、当 有 2、在a,b上可导,并且存在正数L1,使任意的 ,有 则在a,b上有唯一的点
12、 满足 ,称为 的不动点。而且迭代格式对任意初值均收敛于的不动点,并有下面误差估计式:(4-6)要构造满足收敛条件的等价形式一般比较困难。事实上,如果为f(x)的零点,若能构造等价形式,而 ,由 的边疆性,一定存在的邻域 ,其上有 ,这时若初值 迭代也就收敛了。由此构造收敛迭代格式有两个要素,其一,等价形式 应满足;其二,初值必须取自 的充分小邻域,其大小决定于函数f(x),及做出的等价形式 。4.14.84.74.54.34.2总目录总目录4.94.64.4第10页,本讲稿共32页2.3直接迭代法直接迭代法例:例:求代数方程x3-2x-5=0,在x0=2附近的零点。解:1)x3=2x+5 构
13、造的迭代序列收敛。取x0=2,则 准确的解是x=2.09455148150。2)将迭代格式写为 迭代格式不能保证收敛,但并不一定不收敛。VB程序界面:4.14.84.74.54.34.2总目录总目录4.94.64.4第11页,本讲稿共32页【例4-3】(V312)试编程计算0.01mol/L的HAc(Ka1.75E-5)溶液的pH值。在新建窗体上添加一个Command1命令框(在属性窗口将Command1的属性Caption改为计算),对命令框对象Command1的事件Click、PrivateFunctionf(X)和PrivateSubITR(XO,E,x)通用过程输入如下代码。在窗体“通
14、用声明”段用Dim定义KA,C能被本模块的PrivateFunctionf(x)过程存取。n Dim KA,Cn Private Sub Command1_Click)VB调用n C=0.01n KA0.0000175n XO=Sqr(K*C)n E1.0E-5n Call ITR(X0,E,x)n Print pH=”;Int(Log(x)Log(10)*10005)100n End Subn Private Sub ITR(X0,E,X)n xXOn Don XOXn X=f(XO)n LOOp While Abs(XXO)En End Subn Private Function f(x)
15、n f=Sqr(KA*(CX)n End Function第12页,本讲稿共32页4.4松弛迭代法松弛迭代法 有些非线性方程或方程组当用上一节中的直接迭代法求解时,迭代过程是发散的。这时可引入松弛因子,利用松弛迭代法。通过选择合适的松弛因子,就可以使迭代过程收敛。松弛法的迭代公式如下:(4-7)由上式可知,当松弛因子等于1时,松弛迭代变为直接迭代。当松弛因子大于1时松弛法使迭代步长加大,可加速迭代,但有可能使原来收敛的迭代变成发散。当01时,松弛法使迭代步长减小,这适合于迭代发散或振荡收敛的情况,可使振荡收敛过程加速。当k0时,迭代过程为单调收敛过程。当-1ken End sub第22页,本讲
16、稿共32页4.7 割线法割线法在牛顿迭代格式中:,用差商代导数,并给定初始值x0和x1,那么迭代格式可写成如下形式:上式称为割线法。用割线法迭代求根,每次只需计算一次函数值,而用牛顿迭代法每次要计算一次函数值和一次导数值。但割线收敛速度稍慢于牛顿迭代法,割线法为1.618阶迭代方法。做过两点(x0,f(x0)和(x1,f(x1)的一条直线(弦),该直线与x轴交点就是生成的迭代点x2,再做过(x1,f(x1)和(x2,f(x2)的一条直线,x3是该直线与x轴的交点,继续做下去得到方程的根f(a)=0,如图4.4所示。例例4.5:用割线法求方程的根,取x0=1.5,x1=4.0。解:计算结果列于表
17、VB程序4.14.84.74.54.34.2总目录总目录4.94.64.4第23页,本讲稿共32页n【例 4-6】(V316)计算 500mL、1.0mol/L Na2S2O3溶液可以溶解多少克 AgBr。n 在新建窗体上添加两个标签框Label1、Label2(在属性窗口将Label1的属性Caption改为割线法,属性Autosize设为True;在属性窗口将Label2的属性Caption置为空)和一个Command1命令框(在属性窗口将Command1的属性Caption改为计算),对命令框对象Command1的事件Click、Private Sub GX(XO,H,E,XZ)和 Pr
18、ivate Function f(x)通用过程输入如下代码,在窗体“通用声明”段用Dim定义c,k变量为单精度型能被本模块的PrivatenFunction f(x)过程存取。VB程序第24页,本讲稿共32页nDim c,k as singlenPrivate sub command1_click()nH=0.01nC=1#nK1=29000000000000#nKsp=0.00000000000077nK=k1*kspnX0=val(inputbox(“x0=“)nCall gx(x0,h,e,x)nX=int(x*100+0.5)/100nS=500*x/1000*188nW$=chr(1
19、3)+chr(10)nLabel2.caption=“x=“&x&w$&”s=“&s&”g”nPrintnEnd subnPrivate function f(x)nF=(4*k-1)*x*x-4*k*c*x+k*c*cnEnd function第25页,本讲稿共32页nPrivate Sub gx(x0,h,e,x2)nbx0=f(x0)nIf bx0 0 ThennX1=x0-hnElsenX1=x0+hnEnd IfnDonx2=X1-f(X1)/(f(X1)-f(x0)*(X1-x0)nIf Abs(x2-X1)/x2 e ThennExit Donx0=X1nX1=x2nLoopnE
20、nd Subnnext第26页,本讲稿共32页4.8非线性方程组的牛顿方法非线性方程组的牛顿方法为了叙述的简单,我们以解二阶非线性方程组为例演示解题的方法和步骤,类似地可以得到解更高阶非线性方程组的方法和步骤。设二阶方程组 其中x,y为自变量。为了方便起见,将方程组写成向量形式:将在(x0,y0)附近进行二元泰勒展开,并取其线性部分,得到下面方程组:令则有 4.14.84.74.54.34.2总目录总目录4.94.64.4第27页,本讲稿共32页4.8非线性方程组的牛顿方法非线性方程组的牛顿方法如果再将原方程组在u1处进行二元泰勒展开,并取其线性部分,得到下面方程组:解出得出继续做下去,每一次
21、迭代都是一个方程组 4.14.84.74.54.34.2总目录总目录4.94.64.4即为止。第28页,本讲稿共32页4.8非线性方程组的牛顿方法非线性方程组的牛顿方法例例4.7:求解下面非线性方程组取初始值解:解方程得继续做下去,直到时停止。4.14.84.74.54.34.2总目录总目录4.94.64.4第29页,本讲稿共32页4.9 化工生产中非线性方程组求解应用化工生产中非线性方程组求解应用实例实例 在化工生产中,为了求解反应前后各物料的浓度,常常要联立求解一些非线性方程组,这些方程组难以用常规的解析方法求解,一般只能利用数值求解的方法加以求解。下面是在合成氨生产中利用非线性方程组求解
22、方法求解烃类蒸气转化反应前后各物料浓度的实例。例例 4.8 在合成氨生产中,烃类蒸气发生以下转化反应:已知进料甲烷为1mol,水蒸汽为5mol,反应后总压P=1atm,反应平衡常数为:试求反应平衡时各组分的浓度。解:设反应平衡时有x摩尔甲烷转化成CO,同时生成的CO中又有y摩尔转化成CO2,则反应平衡时各组分的摩尔数及分压如下:4.14.84.74.54.34.2总目录总目录4.94.64.4第30页,本讲稿共32页4.9 化工生产中非线性方程组求解应用实例化工生产中非线性方程组求解应用实例将平衡时各组分的分压表达式代入反应平衡常数KP1及KP2的表达式得:由上两式求解分别可得x和y的迭 代表
23、达式:4.14.84.74.54.34.2总目录总目录4.94.64.4第31页,本讲稿共32页4.9 化工生产中非线性方程组求解应用实例化工生产中非线性方程组求解应用实例设x的初值为0.1,y的初值为0.05,若采用直接迭代法进行计算,可得:x1=0.999988y1=1.8707143经计算机编程计算可知,若采用直接迭代的方法求解该方程组,结果是发散的,无法得到真实解。但是,若采用松弛迭代法求解,并取松弛因子小于0.49,则可得到收敛解。其最后的求解结果为:x*=0.9437y*=0.6812将平衡时的x和y值代入可得平衡时各组分的摩尔浓度如下:在该非线性方程组的松弛迭代求解过程中,我们发现若松弛因子大于或等于0.49,该松弛迭代过程是发散的。因此,松弛因子的选取对非线性方程组求解过程是否收敛有很大的影响,在实际应用时应引起高度重视。本题还可以用前面介绍的其他方法求解或改变迭代公式的表达形式进行求解,感兴趣读者请自行求解。4.14.84.74.54.34.2总目录总目录4.94.64.4第32页,本讲稿共32页
限制150内