第五周 2014-3-18 迭代法解方程
- 格式:ppt
- 大小:618.50 KB
- 文档页数:39


求解⼀元多次⽅程(迭代法)1 --*2解⼀元多次⽅程形如 x^5 + x^4 + x = 1034主要做法:51.⾼次⽅程典型的解法就是迭代。
给定初始值x0,6给定精度e,通过公式x[n]=x[n-1]+f(x[n-1])/f'(x[n-1])不停迭代,直到近似解符合精度要求,输出结果。
782.另外还有⼀种⼆分法,对这种⽅法不是太熟悉,就是⾸先给定⼀个区间[a,b],在区间上如果有极值,则有解,把这个区间⼀分为2, [a,c]、[c,b],如果f(a)和f(c)艺号,则解在[a,c]区间,反之在[c,b]区间。
在把[a,c]⼀分为2,这样⼀直分下去,直到 910 */11 #include <iostream>12 #include <math.h>1314using namespace std;1516const double e = 1e-6;17int n;18 pair<double, int> p[12];//⽅程的系数, ⽅程次数1920double f(double x)//⽅程21 {22double sum = 0.0;2324for (int i = 0; i < n; ++i){25if (p[i].second < 0)26continue;27 sum += p[i].first * pow(x, p[i].second);28 }2930return sum - p[n].first;//减去值31 }3233double ff(double x)//导数34 {35double sum = 0.0;3637for (int i = 0; i < n; ++i){38if (p[i].second <= 0)39continue;40 sum += p[i].first * p[i].second * pow(x, p[i].second-1);41 }4243return sum;44 }4546double solve()47 {48double x0 = 1.0;49double xn = 1.0;5051while (true){52 xn = x0 - f(x0)/ff(x0);53if (xn-x0 < e && x0-xn < e)54return x0;55 x0 = xn;56 }57 }5859int main()60 {61int num = 1;62bool flag = false;6364while (cin >> n, n != -1){65int i;66for (i = 0; i < n; ++i){67 cin >> p[i].second >> p[i].first;68 }69 cin >> p[n].second >> p[n].first;7071for (i = 0; i < n; ++i){72 p[i].second = p[n].second - p[i].second + 1;73 }7475if (flag){76 cout << endl;77 }else{78 flag = true;79 }8081 printf("Case %d: %.5lf\n", num++, solve()-1);82 }83return0;84 }85 #include <iostream>86 #include <math.h>8788using namespace std;8990const double e = 1e-6;91int n;92 pair<double, int> p[12];//⽅程的系数, ⽅程次数9394double f(double x)//⽅程95 {96double sum = 0.0;9798for (int i = 0; i < n; ++i){99if (p[i].second < 0)100continue;101 sum += p[i].first * pow(x, p[i].second);102 }103104return sum - p[n].first;//减去值105 }106107double ff(double x)//导数108 {109double sum = 0.0;110111for (int i = 0; i < n; ++i){112if (p[i].second <= 0)113continue;114 sum += p[i].first * p[i].second * pow(x, p[i].second-1);115 }116117return sum;118 }119120double solve()121 {122double x0 = 1.0;123double xn = 1.0;124125while (true){126 xn = x0 - f(x0)/ff(x0);127if (xn-x0 < e && x0-xn < e)128return x0;129 x0 = xn;130 }131 }132133int main()134 {135int num = 1;136bool flag = false;137138while (cin >> n, n != -1){139int i;140for (i = 0; i < n; ++i){141 cin >> p[i].second >> p[i].first;142 }143 cin >> p[n].second >> p[n].first;144145for (i = 0; i < n; ++i){146 p[i].second = p[n].second - p[i].second + 1; 147 }148149if (flag){150 cout << endl;151 }else{152 flag = true;153 }154155 printf("Case %d: %.5lf\n", num++, solve()-1); 156 }157return0;158 }。
迭代法解方程•迭代法如果方程的形式可以化简成 x = f(x) ,其中f(x)是一个比较简单明了的函数例如ln(x)+1。
其相对图形如右图所示,这样我们可以先假设一个x值,将该x代入f(x)中,这样可以计算出一个新的x,重复以上步骤,直到达到一个稳定的x,即相邻两次的x值相差不大。
迭代法有可能出现振动发散的情况,因此如果循环超过一定次数应该退出循环,重新选取初始值。
此外迭代法通常只能解出一到两个方程的实数根。
•二分法如果方程的形式可以化简成 f(x)=0 ,那么我们设法得到一个x1使f(x1)大于零,再设法得到一个x2使f(x2)小于零,那么如果f(x)在x1到x2之间是连续的化,则必然有一个点x0使f(x0)=0。
于是我们计算x1和x2的中点x3,如果f(x3)大于零则说明x0在x3和x2之间否则x0在x1和x3之间,如此循环下去直到得出一个符合要求的根。
如右图所示。
二分法如果可以开始则一定有解,不会出现无解的情况。
当然二分发仍然可能遗漏一些解。
rootx=f_solve(x1,x2)例程数据类型:x1,x2和函数的返回值均为双精度类型参数说明:x1,x2为试探用的x值,要求其相应的y(x1)和y(x2)必需一正一负返 回 值:该函数返回在x1,x2区间中的一个解,如果无解或者输入参数有问题则返回-9999999.99999E-999其他要求:该函数将调用f_y(x)函数,必需有相应函数VERSION 5.00Begin VB.Form Form1Caption = "Form1"ClientHeight = 5700ClientLeft = 60ClientTop = 345ClientWidth = 7230LinkTopic = "Form1"ScaleHeight = 5700ScaleWidth = 7230StartUpPosition = 3 'Windows DefaultBegin VB.PictureBox Picture1Height = 4935Left = 120ScaleHeight = 4875ScaleWidth = 6915TabIndex = 1Top = 720Width = 6975EndBegin mandButton Command1Caption = "Command1"Height = 495Left = 120TabIndex = 0Top = 120Width = 3015EndEndAttribute VB_Name = "Form1"Attribute VB_GlobalNameSpace = FalseAttribute VB_Creatable = FalseAttribute VB_PredeclaredId = TrueAttribute VB_Exposed = FalseOption ExplicitSub draw_pic(ByVal x_min As Double, ByVal x_max As Double, ByVal y_min As Double, ByVal y_max AsDouble)Dim x, i, y As DoublePicture1.Scale (x_min, y_max)-(x_max, y_min)Picture1.Line (0, y_min)-(0, y_max)Picture1.Line (x_min, 0)-(x_max, 0)For x = x_min To x_max Step 0.01y = f_y(x)If y < y_min Then y = y_minIf y > y_max Then y = y_maxPicture1.PSet (x, y), RGB(255, 0, 0)NextEnd SubFunction f_y(ByVal x As Double) As Double ‘定义方程f_y = x + 2 * x ^ 2 - 4 * x ^ 3 + x ^ 4End FunctionFunction f_solve(ByVal x1 As Double, ByVal x2 As Double) As Double ‘定义解及过程 ??ByVal?? Dim x3 As DoubleDim y1 As DoubleDim y2 As DoubleDim y3 As DoubleDim y0 As DoubleDim dx0 As DoubleDim n As Longy1 = f_y(x1) 'x1,x2初始值是多少????? 代入方程,获得第一个试探解的函数值y2 = f_y(x2) '获得第二个试探解的函数值If y1 * y2 > 0 Then '如果两个试探解对应的函数值不是一正一负,则返回错误值f_solve = 9.999E-99MsgBox ("试探解不合适" + Str(y1) + " " + Str(y2))Exit FunctionEnd Ify0 = Abs(y1) + Abs(y2) '获得最初的y的绝对数量级,未来退出循环时需要判断其相对大小If y0 > 1 Then y0 = 1dx0 = Abs(x1 - x2) '初始试探x之间的差距n = 0 '循环计数器Don = n + 1x3 = (x1 + x2) / 2y3 = f_y(x3)If y1 * y3 > 0 Then '新的试探解和y1同号,则用新试探解替代x1x1 = x3ElseIf y2 * y3 > 0 Then '新的试探解和y2同号,则用新试探解替代x2x2 = x3ElseIf y3 = 0 Then '恰好找到了解'注意此处虽然什么也不作,但是不可以删除Elsef_solve = 9.999E-99 '出现了错误Exit FunctionEnd Ify1 = f_y(x1) '获得第一个试探解的函数值y2 = f_y(x2) '获得第二个试探解的函数值Loop While Abs(y3) > 0.000000000001 * y0 And Abs(x1 - x2) > 0.000000000001 * dx0 And n <= 20000 'Picture1.PSet (x3, 0)'Picture1.Print x3'Picture1.Print nf_solve = x3End FunctionPrivate Sub Command1_Click()Dim r As Doubler = f_solve(0.5, 2)Command1.Caption = Str(r)draw_pic -1, 4, -10, 2End Sub•牛顿法如果方程的形式可以化简成 f(x)=0 ,并且可以比较方便的求出f(x)的导数,那么我们只要知道一个点的f(x)就可以根据x,f(x)及f(x)的导数求出下一个更加接近X0的x,循环求解我们可以解出该方程的根。
迭代法求方程近似解迭代法是一种求解方程近似解的方法,其基本思想是通过不断迭代,逐步逼近方程的解。
在实际应用中,迭代法常常被用于求解非线性方程、微积分方程等问题。
迭代法的具体步骤如下:1.选取一个初始值x0;2.根据某种迭代公式,计算出x1,x2,x3,...,xn;3.当满足一定的停止准则时,停止迭代,输出近似解xn。
其中,迭代公式是迭代法的核心,不同的迭代公式会对迭代的速度和精度产生不同的影响。
常见的迭代公式有牛顿迭代法、割线法、弦截法等。
以牛顿迭代法为例,其迭代公式为:xn+1 = xn - f(xn) / f'(xn)其中,f(x)是方程的函数形式,f'(x)是f(x)的导数。
牛顿迭代法的基本思想是,通过不断用切线逼近曲线,找到曲线与x轴的交点,从而求得方程的解。
下面以求解方程x^2 - 2 = 0为例,演示牛顿迭代法的具体步骤:1.选取初始值x0 = 1;2.根据牛顿迭代公式,计算出x1,x2,x3,...,xn:x1 = x0 - (x0^2 - 2) / (2 * x0) = (x0 + 2 / x0) / 2 = 1.5x2 = x1 - (x1^2 - 2) / (2 * x1) = (x1 + 2 / x1) / 2 = 1.4167x3 = x2 - (x2^2 - 2) / (2 * x2) = (x2 + 2 / x2) / 2 = 1.4142...xn = 1.414213563.当满足一定的停止准则时,停止迭代,输出近似解xn。
在实际应用中,迭代法的停止准则通常有两种:一是设定迭代次数的上限,当迭代次数达到上限时,停止迭代;二是设定一个误差范围,当迭代过程中的误差小于该范围时,停止迭代。
总之,迭代法是一种简单而有效的求解方程近似解的方法,其优点是可以适用于各种类型的方程,并且可以通过调整迭代公式和停止准则来提高求解的精度和效率。
在实际应用中,我们可以根据具体问题的特点选择合适的迭代公式和停止准则,以达到最优的求解效果。