[计算机数值分析]牛顿法求解方程的根
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[计算机数值分析]牛顿法求解方程的根相关的知识,希望对你有一定的参考价值。
问题描述
对于方程 f(x) = 0, 设已知它的近似根 xk,则函数f(x)在点 xk附近可用一阶泰勒多项式 p(x) = f(xk) + f′(xk)(x - xk) 来近似,因此方程 f(x) = 0可近似的表为 p(x) = 0。后者是一个线性方程,它的求根是相对容易的,我们取 p(x) = 0 的根作为 f(x) = 0 的新的近似根,记作 xk′,则xk′ = xk - f(xk) / f′(xk), 这就是著名的牛顿公式,相应的迭代函数为 φ(x) = x - f(x) / f′(x)。
例:用牛顿法求方程 2x³ - 4x² + 3x - 6 = 0
f(x) = 2x³ - 4x² + 3x - 6, f′(x) = 6x2 - 8x + 3,
从而有迭代函数 φ(x) = x - f(x) / f′(x)
即 φ(x) = x - (2x³ - 4x² + 3x - 6)/ (6x2 - 8x + 3)
运行示例
源码
//用牛顿法求解方程的根
#include<iostream>
#include<cmath>
using namespace std;
double f(double x); //f(x)为需要求解方程的对应函数
double f1(double x); //f1(x)为f(x)的一阶导数
int main(void)
double accuracy, N; //accuracy为精度;N为最大迭代次数;
double x0, x1; //x0为运用牛顿法时选取的初值;x1为迭代初值的下一次迭代值
int count; //count为当前迭代次数
cout << "请输入迭代初值:";
cin >> x0;
cout << "请输入精度:";
cin >> accuracy;
cout << "请输入最大迭代次数:";
cin >> N;
count = 0;
do
count++; //迭代次数自增1
if (count > N)
cout << "达到允许的最大迭代次数!迭代结束!" << endl;
break;
if (f1(x0) == 0)
cout << "在x0附近f(x)的一阶导数值为0,不适用牛顿法求方程的根!" << endl;;
break;
else
x1 = x0 - f(x0) / f1(x0);
cout << "第" << count << "次迭代,方程的近似根为:" << x1 << endl;
//交换x0与1的值,便于进行下一次迭代
double temp;
temp = x1;
x1 = x0;
x0 = temp;
while ((abs(x1 - x0) > accuracy));
return 0;
double f(double x) //原函数
double result = 2 * pow(x, 3) - 4 * pow(x, 2) + 3 * x - 6;
return result;
double f1(double x) //导函数
double result = 6 * pow(x, 2) - 8 * x + 3;
return result;
以上是关于[计算机数值分析]牛顿法求解方程的根的主要内容,如果未能解决你的问题,请参考以下文章