迭代方法求解方程
- 格式:doc
- 大小:80.00 KB
- 文档页数:9
使⽤“⽜顿迭代法”求解⽅程使⽤⽜顿迭代法求解⽅程尽管通过因式分解和利⽤求根公式可以很⽅便的得出多项式⽅程的根,但⼤多数时候这个多项式的次数都很⾼,计算将变得⾮常复杂,因此,我们必须转向⼀些近似解法。
⽜顿迭代法是其中最好的⽅法之⼀。
从根本上说,⽜顿迭代法通过⼀系列的迭代操作使得到的结果不断逼近⽅程的实根。
⾸先,要选择⼀个初始值x=x0,使得该初始值接近实根的值。
然后,迭代计算如下的公式:x i+1 = x i - f(x i) / f '(x i)直到x i+1达到⼀个满意的近似结果为⽌。
在这个公式中,f(x)是要求解的多项式⽅程,⽽f '(x)是f(x)的导数。
多项式求导多项式求导是微积分的基础,现在让我们来看看针对多项式求导的公式化描述。
要计算出多项式的求导结果,只需要对多项式的每⼀项套⽤如下两个公式:d/dx * k = 0, d/dx *kx r = krx r-1这⾥的k是为常数,r是有理数,x是未知数。
符号d/dx表⽰求导,其中x是多项式中的变量。
对于多项式中的每⼀常数项,套⽤第⼀个公式;否则,就⽤第⼆个公式。
假设有如下函数:f(x) = x3 + 5x2 +3x +4要得到求导后的结果f '(x),对该多项式的前三项套⽤第⼆个公式,最后⼀项套⽤第1个公式,得到结果如下:f '(x) = 1 * 3x(3-1) + 5 * 2x(2-1) + 3 * 1x(1-1) + 0 = 3x2 + 10x +3有时候也有必要进⾏⾼阶求导,即导数的导数。
⽐如,f(x)的2阶求导可记为f ''(x),它是对f '(x)的求导结果。
同理,f(x)的3阶求导可记为f'''(x),这是对f ''(x)的求导结果,以此类推。
因此,在前⾯的例⼦中,如果要计算f(x)的2阶导数的话,我们按照如下的⽅式对f '(x)求导即可:f ''(x) = 3 * 2x(2-1) + 10 * 1x(1-1) + 0 =6x +10理解1阶和2阶导数理解1阶和2阶导数的意义,是正确使⽤⽜顿迭代法⾮常重要的⼀点。
求解非线性方程的三种新的迭代法
迭代法是一种通过迭代逼近的方式来求解方程的方法。
它的基本思想是通过不断逼近
方程的解,使得逼近值与真实解的差距越来越小,最终得到方程的解。
下面介绍三种新的迭代法:牛顿迭代法,弦截法和切线法。
一、牛顿迭代法
牛顿迭代法是一种通过利用函数导数的信息来逼近方程解的方法。
它的迭代公式为:
x_(n+1) = x_n - f(x_n)/f'(x_n)
x_n表示第n次迭代得到的逼近解,f(x_n)表示在x_n处的函数值,f'(x_n)表示在x_n 处的导数值。
牛顿迭代法的优点是收敛速度快,通常是二阶收敛,但其缺点是需要计算函数的导数,如果导数计算困难或者导数为零的情况下,该方法可能不适用。
二、弦截法
三、切线法
切线法的优点和牛顿迭代法类似,但其缺点是需要计算函数的导数,且对于初始逼近
解的选择比较敏感。
牛顿迭代法、弦截法和切线法都是三种常用的非线性方程迭代法。
它们各自有着优点
和缺点,适用的领域和条件也不尽相同。
在实际问题中,需要根据具体情况选择合适的方
法来求解非线性方程。
求解⼀元多次⽅程(迭代法)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 }。