栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

牛顿迭代法及其实际应用(附C++代码)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

牛顿迭代法及其实际应用(附C++代码)

牛顿迭代法介绍

     牛顿迭代法主要用于求解对于不便于计算的非线性方程实根的问题,利用牛顿迭代法求出近似解。

原理介绍

对于非线性方程在附近进行Tayor展开: 

取其线性部分作为非线性方程 = 0的近似方程 

设,则解为:

再把在附近展开Tayor级数,取其线性部分作为 = 0的近似方程,若,则有:

如此可以推导出Newton法:

 

实际应用举例

为了更好理解牛顿迭代法,利用求解方程根进行举例

求导方程为:

C++代码实现
#include
#include
using namespace std;
//实例:y=x^3+e^x
double x;        //定义变量x
double X;        //临时变量,记录第k次的x值,用于判断精度,第k次与第k+1次做差比较精度             
double y(double x)          //定义关于x的表达式
{
	return -x*x*x + exp(x);
}
double dy(double x)         //定义导数公式
{
	return -3 * x*x + exp(x);
}

bool accuracy(double x0)
{
	if (fabs(X - x0) > 1e-5)          //定义精度10的负5次方
	{
		return 1;
	}
	else
		return 0;
}
void ND(double x0)    //牛顿迭代法
{  
	int n = 0;            //记录迭代次数
	do{
		double _y = y(x0);
		double _dy = dy(x0);
		X = x0;
		x0 = x0 - _y / _dy;
		n++;
		cout << "第" << n << "次迭代结果为:" ;
		printf("%.5fn", x0);
	} while (accuracy(x0));
	cout << "共迭代" << n << "次,最终近似解为:" ;
	printf("%.5fn", x0);
}

void main()
{
	x = 4.5;    //定义x0初始值
	ND(x);
}

故由此可知,函数 函数近似解为4.53640

补充优化

 在实际求解非线性放出实根时,部分方程可能会出现求导困难的情况,故可以利用差商代替求导,则公式为:

C++代码为:
#include
#include
using namespace std;

//实例:y=x^3+e^x
double x;        //定义变量x
double X;        //临时变量,记录第k次的x值,用于判断精度,第k次与第k+1次做差比较精度             
double y(double x)          //定义关于x的表达式
{
	return -x*x*x + exp(x);
}

bool accuracy(double x0)
{
	if (fabs(X - x0) > 1e-5)          //定义精度10的负5次方
	{
		return 1;
	}
	else
		return 0;
}
void ND_optimize(double x1,double x0)    //牛顿迭代法差商改进
{
	double _y1 = y(x0);
	double _y2 = y(x1);
	int n = 0;            //记录迭代次数
	do{
		double _y1 = y(x0);
		double _y2 = y(x1);

		X = x0;
		x0 = x0 - (_y1 / (_y1-_y2)) * (x0-x1);
		n++;
		cout << "第" << n << "次迭代结果为:";
		printf("%.5fn", x0);
	} while (accuracy(x0));
	cout << "共迭代" << n << "次,最终近似解为:";
	printf("%.5fn", x0);
}

void main()
{
	double x1 = 4.5;    //定义x1初始值
	double x2 = 4;      //定义x2初始值
	ND_optimize(x1,x2);
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1019062.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号