如何用牛顿迭代求方程的重根和复根牛顿迭代公式为:x(n+1)=x(n)-f(x(n))/f'(x(n))就是数值分析中学的,
来源:学生作业帮助网 编辑:六六作业网 时间:2025/01/21 22:05:07
如何用牛顿迭代求方程的重根和复根牛顿迭代公式为:x(n+1)=x(n)-f(x(n))/f'(x(n))就是数值分析中学的,
如何用牛顿迭代求方程的重根和复根
牛顿迭代公式为:x(n+1)=x(n)-f(x(n))/f'(x(n))
就是数值分析中学的,
如何用牛顿迭代求方程的重根和复根牛顿迭代公式为:x(n+1)=x(n)-f(x(n))/f'(x(n))就是数值分析中学的,
解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法.把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2!+… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n)).
以上解决的是单根的情况,对于f(x)=0具有多重根的问题应采用下式x(n+1)=x(n)-f(x(n))*f'(x(n))/[(f'(x(n)))^2-f(x(n))*f''(x(n))],而求复根则在初值后面+i
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程...
全部展开
牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。
设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。
解非线性方程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。把f(x)在x0点附近展开成泰勒级数 f(x) = f(x0)+(x-x0)f'(x0)+(x-x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x-x0)=f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。
收起
牛顿迭代法
你给它一个初始迭代值,它可能可以求出一个根。
你如果要求多个根的话,那么你必须换初始迭代值。
所以个人觉得用它求重根的,估计相当难。
复根的话,估计还好一些,只要我们操作符支持复根计算(这方面MATLAB可以实现)。不过你如果要用C语言求的的复根的话,估计还比较麻烦。
/*=====================================...
全部展开
牛顿迭代法
你给它一个初始迭代值,它可能可以求出一个根。
你如果要求多个根的话,那么你必须换初始迭代值。
所以个人觉得用它求重根的,估计相当难。
复根的话,估计还好一些,只要我们操作符支持复根计算(这方面MATLAB可以实现)。不过你如果要用C语言求的的复根的话,估计还比较麻烦。
/*=======================================================
*Author :wacs5
*Date :20081222(YYYYMMDD)
*Function :牛顿迭代法求方程的根
* 求x*x*x-x*x-1=0的解(在1.5附近)
*=======================================================*/
#include
#include
#include
#define MAX_DIEDAI_TIME 200
main()
{
int n=0;
double x=1.5; /*初值*/
double jingdu=1e-5; /*精度*/
double function(double x);
double d2function(double x);
double newton_diedai(double x0,int *n,double jingdu);
system("cls");
x=newton_diedai(x,&n,jingdu);
printf("x=%.5lf\ty=%lf\n",x,function(x));
getch();
return 0;
}
/*====================
想要求解的方程的表达式
======================*/
double function(double x)
{
return x*x*x-x*x-1;
}
/*===========================
想要求解的方程的表达式的导数
=============================*/
double d2function(double x)
{
return 3*x*x-2*x;
}
/*=============================================
牛顿迭代法解方程组的解
x0为迭代的初值,n为迭代次数,jingdu为精度
function为求根代数式,d2functoin为其导数
返回最终符合一定精度的根
*/
double newton_diedai(double x0,int *n,double jingdu)
{
double x,temp;
temp=d2function(x0);
if (fabs(temp)>1e-10) /*防止除数为0*/
{
x=x0-function(x0)/temp;
printf("n=%d\tx=%.5lf\n",*n,x);
}
else
{
printf("error:div 0:\nPress any key to exit:");
getch();
exit(1);
}
if (++(*n)>MAX_DIEDAI_TIME)
{
printf("diedai time:%d > MAX_DIEDAI_TIME:\nPress any key to exit:",*n);
getch();
exit(1);
}
temp=function(x);
if (fabs(temp)
else
return newton_diedai(x,n,jingdu);
}
收起
重根,是
x(n+1)=x(n)-f(x(n))*f'(x(n))/[(f'(x(n)))^2-f(x(n))*f''(x(n))]
牛顿迭代好像不能求复根,因为利用的是与坐标轴的交点,在复平面上就不会有交点了
你是高中生吧?那要等到大学中学了《数值分析》这一课才能……