python牛顿法求多项式的根

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python牛顿法求多项式的根相关的知识,希望对你有一定的参考价值。

参考技术A #include<iostream.h>
#include<math.h>
#include<conio.h>
const int N=200;
//带入原函数后所得的值
double f(float x)

return (x*x*x-1.8*x*x+0.15*x+0.65);

//带入一阶导函数后所得的值
double f1(double x)

return (3*x*x-3.6*x+0.15);

//牛顿迭代函数
double F(double x)

double x1;
x1=x-1.0*f(x)/f1(x);
return (x1);

void main()

double x0,D_value,x1,y[4];
int k=0,count=0;
for(;;)

if(count==3)break;
cout<<"输入初始值:";
cin>>x0;
do

k++;
x1=F(x0);
D_value=fabs(x1-x0);
x0=x1;

while((D_value>0.000005)&&(k<=N));
for(int j=0,flag=0;j<count;j++)


if(fabs(y[j]-x1)<0.000005)
flag=1;
cout<<"该数值附近的根已经求出,请重新换近似值"<<endl;
break;


if(flag==1)
continue;
else

cout<<"方程的一个根:"<<x1<<","<<" 迭代次数为:"<<k<<endl;
y[count]=x1;
count++;

//else

//cout<<"计算失败!"<<endl;


//你的程序其实没问题,牛顿迭代法本身循环一次只能找到一个答案,只要再建一个循环控制使
//用迭代法的次数和判断根的个数就行。我又加了一个判断是否有重复的根的循环。
//希望能对你有所帮助。

牛顿法、黄金分割法、二次插值法实验(最优化1)

参考技术A

在生产过程、科学实验以及日常生活中,人们总希望用最少的人力、物力、财力和时间去办更多的事,获得最大的效益,,所以最优化理论和方法日益受到重视。

无约束最优化计算方法是数值计算领域中十分活跃的研究课题之一,快速的求解无约束最优化问题,除了自身的重要性以外,还体现在它也构成一些约束最优化问题的子问题。因此,对于无约束最优化问题,如何快速高精度的求解一直是优化工作者十分关心的事。本文验证求解 一维无约束最优化问题 的三种线性搜索方法,分别是牛顿法、黄金分割法,二次插值法。

min ⁡f(x)=3x 4 - 4x 3 -12x 2

牛顿迭代法(Newton’s method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,其基本思想是利用目标函数的二次Taylor展开,并将其极小化。牛顿法使用函数 f(x)的泰勒级数的前面几项来寻找方程 "f(x)=0" 的根。牛顿法是求方程根的重要方法之一,其最大优点是在方程 "f(x)=0" 的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时非线性收敛,但是可通过一些方法变成线性收敛。

方程 f(x)=0 的根 x * 可解释为曲线y=f(x)轴的焦点的横坐标。如下图:

设 x[k]是根 x * 的某个近似值,过曲线 y=f(x)上横坐标为 x[k]的点P[k]引切线,并将该切线与 x轴的交点 的横坐标 x_k+1_作为 x * 的新的近似值。鉴于这种几何背景,牛顿法亦称为切线法。

将f(x k+1 )在x=x k 处一阶泰勒展开:

公式不打了
令函数趋于0,求与x轴交点:

分别取-1.5,0.4,1.0,1.6,2.8

在凸函数很初始点选取好的情况下,收敛快。

Ø 计算二阶导数,计算量大

Ø 要求函数二阶可微

Ø 收敛性与初始点选取有关

黄金分割法适用于[a,b]区间上的任何单股函数求极小值问题,对函数除要求“单峰”外不做其他要求,甚至可以不连续。因此,这种方法的适应面非常广。黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间 ?内适当插入两点 ?,并计算其函数值。 ?将区间分成三段,应用函数的单峰性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。

维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。如图所示

黄金分割法是用于一元函数 ?在给定初始区间 ?内搜索极小点?的一种方法。其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间。

具体步骤是:在区间 ?内取点: ?分为三段。如果 ?,令?;如果 ?,令 <?,如果 ?都大于收敛精度?重新开始。因为 ?为单峰区间,这样每次可将搜索区间缩小0.618倍或0.382倍,处理后的区间都将包含极小点的区间缩小,然后在保留下来的区间上作同样的处理,如此迭代下去,将使搜索区 ?逐步缩小,满足预先给定的精度时,即获得一维优化问题的近似最优解。

[-2,0],[1,3]

很巧妙地使每次分割点都为上次的黄金分割点,可以复用上次运算的结果,简化计算。它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数,即只在单峰区间内才能进行一维寻优,其收敛效率较低。

在求解一元函数?的极小点时,在搜索区间中用低次(通常不超过三次)插值多项式?来近似目标函数,后求该多项式的极小点(比较容易计算),并以此作为目标函数?的近似极小点。如果其近似的程度尚未达到所要求的精度时,反复使用此法,逐次拟合,直到满足给定的精度时为止。

考虑二次多项式

令 ,得 。这意味着我们要求a,b。
今考虑在包含 的极小点 的搜索区间 中,给定三个点 , , ,满足
< <
> <
利用三点处的函数值 , , 构造二次函数,并要求插值条件满足

令 ,i=1,2,3。解上述方程组得

于是,二次函数 的极小点为

设 。求得 和 以后,如果
≤ ,当 > 时,
或者如果
≤ ,当 < 时。
则我们认为收敛准则满足。如果 < ,则极小点估计为 ,否则为 。
若终止准则不满足,则利用 提供的信息,从 , , 和 中选出相邻的三个点,将原来的搜索区间缩小,然后重复上述过程,直到终止准则满足为止。

初始步 给出?,?,?,满足上述设计步骤。
步1 由上述设计步骤计算?。
步2 比较?和?的大小,如果?>?,则转步3;否则转步4。
步3 如果?≤?,则
?,?,?,?,
转步5;否则?,?,转步5。
步4 若?,则
?,?,?,?,
转步5;否则?,?,转步5。
步5 如果收敛准则满足,停止迭代;否则转步1,在新的搜索区间[?,?]上按公式计算二次插值函数的极小点?。

-2.5,-1.4,-0.3
-0.3,1.5,3.3.

插值法仅需计算函数值,不涉及导数、Hesse矩阵等的计算,计算起来相对比较简单,能够适用于非光滑和导数表达式复杂或表达式写不出等种种情形。

当迭代步数较多时,计算过程比较复杂,计算量较大,计算起来比较麻烦。当迭代点离目标函数的最优解较远时,追求线性搜索的精度反而会降低整个算法的效率。

用符号推导画图

picture.py

Gold_ratio.py

Newton.py

Polynomial_interpolation.py

以上是关于python牛顿法求多项式的根的主要内容,如果未能解决你的问题,请参考以下文章

[计算机数值分析]牛顿法求解方程的根

牛顿法、黄金分割法、二次插值法实验(最优化1)

[计算机数值分析]牛顿下山法求方程的根

c_cpp 牛顿法数值求解5次多项式的所有根。

matlab中牛顿法编程

二分查找法和牛顿法求根号的实现