1、高次方程求解,1、 通用函数的程序编写,问题:如何求一个函数的解,而函数是可以随时替换的。 例如: F(x)=x3+4x2+5 F(x)=ex-5,实现步骤:,1在窗体上加一个Scriptcontrol控件 2 在工程中添加一个类模块class1. 类模块中的代码: Public K1 As Double,1、 通用函数的程序编写,Private Function Hanshu(X As Double, Str1 As String) As Double On Error Resume Next Dim shar As New Class1 ScriptControl1.AddObject “
2、sh“, shar ScriptControl1.AddCode “Function F(x)“ & vbCrLf & “kk=“ & Str1 & vbCrLf & “sh.k1 = kk “ & vbCrLf & “End Function“ ScriptControl1.Run “F“, X Hanshu = shar.K1 ScriptControl1.Reset End Function,1、 通用函数的程序编写,作业1: 试设计一个工程,可以计算函数的值。 2 分别输出x1,2,310函数的值。 3 测试替换了函数表达式后,你编写的程序是否有效。,1、 通用函数的程序编写,课题2
3、:高次方程求解:,在解决科学研究和工程领域中的实际问题时,往往涉及到高次方程。高次方程解的个数和方程的次数相对应,即使只在实数范围内考虑,大多也有几个解。但是,对于从解决土木工程问题归纳得到的高次方程,其有意义的解大多仅有一个,并且是正数解。,2.1 高次方程求解原理,计算机解高次方程的基本过程大致如下: 以x2-2=0为例,令y=x2-2 其函数图像如图。y=0时的x值(x=土20.5)即为原方程的解。在x =20.5附近y值由负变正。由于函数是连续的,所以必定存在y=0对应的点,该点即为原方程的一个解。其他方程也是如此,如果知道了一个解的区间,就可以通过代人不同的x值观察y的变化,从而逐次
4、逼近该解。,高次方程求解常用方法,高次方程的常用解法有扫描法、对分法、优选法、迭代法、牛顿法等。,2.2 扫描法求解方程的根,扫描法的主要过程是: 1.寻找方程解所在的区域a,b。由初始点a出发,根据步长h逐次迭代找到b点,使f (a ) X (b) = 0 ,前一点即为a,f(a)与f(b)的值为一正一负。由于从实际土木问题中提炼出的函数f(x)在a,b连续,所以在a,b内必有一解x0,使f(x0)=0。该过程也可固定a点不变,单纯扩大区域找b点.,2.2 扫描法求解方程的根,2.缩小解所在的区域a,b。十等分a,b,逐点求f(xi)值,直至相邻两点的值符号相反,这两点即为新的区域a,b。
5、3.重复上述过程直至收敛,达到一定精度为止。,2.2 扫描法求解方程的根,注意,求实际土木工程问题的解时,起始点a应取足够小(小于解)或干脆取a =0。由于其有意义的解是一个正数解,搜索方向只要向正向进行,甚至根据实际情况,直接选取适当区域a,b,然后从步骤2开始求解。而一般的高次方程则要复杂些,解不一定比a值大,因此解的区域也可能在初始点的另一边,搜索方向需先判别。,2.2 扫描法求解方程的根,扫描法程序流程图见图2-2,图中h为步长,e为要求的精度。 扫描法程序中,因为要判断的是两函数的符号,而不是它们的大小,利用符号函数可使计算量减少,即用msgn(f(a),n=sgn(f(b)替代原来
6、的计算更合理。,扫描法求方程根的流程图,2.2 扫描法求解方程的根,用扫描法求方程x2-2=0的正数解,其计算结果见表2-1,2.2 扫描法求解方程的根,由计算结果知,方程x2-2=0的一个解在1. 414至1. 415之间,只要进一步缩小步长.重复上述过程,可获得更高精度。,2.2 扫描法求解方程的根,Dim M%, N%, i As Double Dim A#, B#, H#, E#, X#, Str2$ Dim Str1$ i = 1 Str1 = “计算次数 a= b= mn “ & vbCrLf A = Val(Text2)初始值 H = Val(Text3)求解步长 E = Val
7、(Text4)求解精度 Str2 = Text1.Text函数表达式 M = Sgn(Hanshu(A, Str2),2.2 扫描法求解方程的根,Do B = A + H N = Sgn(Hanshu(B, Str2) Str1 = Str1 & i & Space(3) & A & Space(3) & B & Space(3) & M * N & vbCrLf If M * N 0 Then A = B M = N i = i + 1 ElseIf M = 0 Then X = A Exit Do ElseIf N = 0 Then X = B Exit Do,ElseIf H 5000
8、Then GoTo err1: End If Loop Until H = E,2.2 扫描法求解方程的根,Text5 = “方程的解为:x=“ & X & vbCrLf & Str1 Exit Sub err1: MsgBox “找不到方程的根,计算次数已经超过了5000次,请确认输入的函数是否正确 ”, vbInformation, “找不到方程的根“,2.2 扫描法求解方程的根,2.2 作业2:,根据以上的基本步骤与程序流程图: (1)编写扫描法求解高次方程的根 (2)程序能够通用化,即扫描法要用过程或函数来完成,供VB调用。 (3)高次方程可以任意改变。,2.3 对分法求解,对分法 扫
9、描法运算量大,为减少工作量可用对分法或优选法,其基本思想和扫描法相同,即逐次缩小解的区域范围。,2.3 对分法优选法求解,实际操作时,初始区域可取足够大,使解被包含在内,这在解与实际化学问题相关的方程时很容易确定。在缩小区域a,b时则有所不同:在a,b取中点c。 (即对分点),求f(c)值。并与f(a)或f(b)比较,舍弃符号相同的点,保留符号相反的点在新的区域内重复上述过程,直至达到要求的精度。 用对分法求一元高次方程解的程序流程图见图2-3,2.3.1 对分法,2.3.2对分法流程图,2.3 对分法优选法求解,2.3 对分法优选法求解,2.3.3 示例,2.3.4 对分法关键程序,Priv
10、ate Sub Erfenfa(Str1 As String, A As Double, B As Double, Eps As Double) Dim Fx As Double, Fa As Double, Fb As Double, X As Double, i As Integer Dim Strtmp As String Fa = Hanshu(A, Str1): Fb = Hanshu(B, Str1) If Fa * Fb 0 Then Text4 = “方程根不在你规定的区间“ Exit Sub End If,If (Fa = 0 Or Fb = 0) Then 如果Fa,Fb0
11、,则就是方程的根 If (Fa = 0) Then X = A GoTo 20 Else X = B GoTo 20结束程序 End If End If,2.3 对分法优选法求解,Strtmp = “计算次数I= A= B= 中点X= 函数值“ & vbCrLf i = 1 Do Until Abs(A - B) = Eps X = (A + B) / 2 If Abs(Hanshu(X, Str1) = 0 Then GoTo 20 如果Hanshu(X, Str1)=0,说明此时的x已经是方程的解 If Hanshu(X, Str1) * Hanshu(A, Str1) 0 Then B
12、= (A + B) / 2 ElseIf Hanshu(X, Str1) * Hanshu(B, Str1) 0 Then A = (A + B) / 2 End If,Strtmp = Strtmp & i & Space(3) & A & Space(3) & B & Space(3) & (A + B) / 2 & Space(3) & Hanshu(X, Str1) & vbCrLf i = i + 1 If i 5000 Then Text4 =“达不到你所要求的精度,已经累加计算了5000次“ Exit Do End If Loop,2.3.4 对分法关键程序,2.3 对分法优选法
13、求解,2.3.5 程序界面,2.3 对分法优选法求解,2.3.6 作业3:,本节已经给出了对分的调用程序,请编写程序界面,完成输入和输出。 要求求解时,列出每次求解时的中间过程。,2.3 对分法优选法求解,2.4 优选法,优选法又叫 0. 618法,与对分法流程基本相同,但每次插人点。不是区域的中点,而是在区域的0. 618处,即c=a+0.618(b-a)或c=b-0.618(b-a),一般收敛速率更快。 用对分法求解方程x2-2=0时的计算结果见表22,2.4.1 优选法计算表,2.4 优选法,2.4.2 作业,按照对分法求解方法,编写优化法求解方程根的程序, 要求:每一个循环中间步骤要输
14、出。,2.4 优选法,2.5 迭代法,高次方程也可利用迭代方法求解。把原方程f(x)0。进行适当变换,建立迭代方程xi1=G(x)依次迭代,直至收敛。 例2-1求方程x3-x-1 =0在x=1.5附近的根。 方程由f(x)=0形式改写成迭代方程:,以1.5作x的初值x0,代入上式求出x11.3572,再以x1代入,进一步求出x2,直到 计算结果见下表(0.00001),2.5 迭代法(原理),2.5 迭代法(原理),2.5.1 注意事项,迭代法的关键在于选定合适的迭代方程,要求迭代方程收敛,否则,因发散而得不到方程的解。如上例,若用x=x3-1为迭代方程,同样取x0=1.5,则x1= 2. 3
15、75,x2= 12.3965显然xk的值越来越大,即迭代方程发散,正因为迭代法有此缺陷而限制了它的使用。确定迭代方程是否收敛,可以用|G(x)|1进行判别,当x满足此式时一般收敛,否则发散。,2.6 牛顿法,牛顿法又称弦切法,也是迭代法的一种。 求f(x) = 0的解,即求曲线f(x)与横坐标的交点a(如图2-5所示),在a点附近x0处的斜率,所以,所以迭代方程为:,2.6牛顿法,结束条件: 直到f(xi)=0,即xi+1=xi或|xi+1-xi|为止。,2.6.1 牛顿法举例,思考题1: 用牛顿迭代法求解x2-25=0的正数解。 自己用笔先计算。,2.6.1 牛顿法举例,牛顿迭代收敛快,尤其
16、是土木方程,总有一实数解,且知道解的基本范围,故使用很方便。,2.6.3 牛顿迭代法的近似解法,有时,f(x)的表达式很复杂或无法求时 怎么办呢?,2.6.3 牛顿迭代法的近似解法,可用数值近似法替代: 式中,为远小于xi的一个小数。,本节 上机作业,4.写出用0.618法求解一元三次方程的程序框图。按流程求出方程2x3+3x2-17x-30=0在1,10区域的解,精度为0.01. 5,用迭代法解方程f(x)x-sinx-0.5=0。精度0. 001 6.用牛顿近似迭代法求x2+10cosx=0的根 要求能够输出每一步计算的结果。,本节 上机作业,牛顿迭代法求解时应注意:作业7 给的初值不同时
17、,求解的解并不同,这时因为如果方程有多个解,它是趋于最近的解。例如作业中2x3+3x2-17x-30=0 ,分别初值代入-4,-3,-2,0.1,2分别代入,找到方程的解。,思考题,本节讲的扫描法,对分法,优选法及迭代法,当求到一个合适的解后,程序就自动完成了, 问题提出,如何求出方程所有的解:,数值积分,1 定积分的求解,在高等数学中,对一个定积分 的求解,可以利用牛顿一莱布尼兹(Newton-Leibniz)公式,即 这里F(x)是f(x)的一个原函数。,但是,在科学研究和工程技术中常会遇到下述几种情况, 如: 1.被积函数的结构复杂,求原函数困难 2.原函数不能用初等函数表示; 3.被积
18、函数不存在原函数。 这时用牛顿一莱布尼兹公式精确计算积分值相当困难,需要建立积分的近似计算方法。数值积分就是一种常用的近似计算方法。数值积分不受被积函数有无解析解的限制,土木工程中都可用数值积分解决。 本章介绍最基本的数值积分法,它们是矩形法、梯形法、辛普森法。,2 矩形积分法,4-1矩形 在满足一定精度的范围内.数值积分可以只利用被积函数来求得积分值,为什么可以这样进行呢? 我们知道,函数f(x)在区间a,b之间求积,就是求图4-1中的f(x)曲线与x轴以及两直线x=a , x = b所围成的几何图形的面积。,2.1 基本原理,如图4-2所示,我们把区间a,b分为n个等分,每等分长为x,那么
19、其面积,作业1: 试编程实现上述矩形积分 要求是个通用程序 通过传递参数计算,2.2 关键程序代码,Public Function JuxingJifen(Str1 As String, A As Double, B As Double, DengFen As Integer) As Double Dim Sum1 As Double, i As Long, H As Double H = Abs(B - A) / DengFen Sum1 = 0 For i = 1 To DengFen Sum1 = Sum1 + Hanshu(A + i * H, Str1) * H Next Juxin
20、gJifen = Sum1 End Function,Str1 函数表达式,但必须符合VB的表示方法。 A,B 积分的上下限 Dengfen积分区间的等分份数,2.3 精度控制,在计算时,曲线以下、矩形以上形如三角形的面积都未被考虑,故有一定的误差。当然,若将x取得小一些,误差就可减小,不过计算量却要大大增加,从而也增大了误差的积累。,3 梯形积分法,减少误差的一种方法是,将每个等分用梯形代替矩形,如图4 3所示。计算方法相应地改为:,3.1 梯形积分法举例,例4-1利用梯形法求积分的近似解。,解:该积分的解析解是0.333.。按梯形法,将积分区间二等分(n = 2 ),3.1 梯形积分法举例
21、,随n增大,x减小,近似结果趋近于解析解,见表,3.2 程序关键代码,但是梯形法以直线来代替曲线仍有误差,如果用某种曲线来代替,就能进一步减少误差,为此而发展了辛普森求积方法。,Public Function TixingJifen(Str1 As String, A As Double, B As Double, DengFen As Integer) As Double Dim Sum1 As Double, i As Long, H As Double H = Abs(B - A) / DengFen Sum1 = 0 For i = 1 To DengFen Sum1 = Sum1 +
22、 (Hanshu(A + (i - 1) * H, Str1) + Hanshu(A + i * H, Str1) / 2 * H Next TixingJifen = Sum1 End Function,4辛普森法求积,辛普森求积公式又叫做三点求积公式,或叫做抛物线求积公式。如图所示,将曲线f(x)视为抛物线,表示为,4.1 举例说明,利用辛普森方法求下式积分的近似值。,4.1 举例说明,解:将积分区间0,1四等分,用辛普森公式得,4.2 关键代码,Public Function XinPuJifen(Str1 As String, A As Double, B As Double, Den
23、gFen As Integer) As Double Dim Sum1 As Double, i As Long, H As Double H = Abs(B - A) / DengFen / 2 Sum1 = 0 Sum1 = Hanshu(A, Str1) For i = 1 To DengFen * 2 Step 2 Sum1 = Sum1 + 4 * (Hanshu(a+i * H, Str1) Next,For i = 1 To DengFen - 1 Sum1 = Sum1 + 2 * Hanshu(A + 2 * i * H, Str1) Next Sum1 = Sum1 + Hanshu(B, Str1) Sum1 = Sum1 * H / 3 XinPuJifen = Sum1 End Function,5 作业,1.编写程序,用矩形积分法求解下式积分值: 分别打印分成4份,10份,20份的值,并估计误差。,5 作业,2.用梯形积分法求解上题,并估计分成相等份时与解析解的差别。 3.用辛普森法求解上式,试估误差,并与解析解对比。 比较上述三种方法,哪一种方法更容易逼近精确解。,