用牛顿迭代法求多项式的根(C/C++语言)

求x^3-1.8*x^2+0.15*x+0.65=0的解,有三个解,已知!
我的程序是:
#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;
int k=0;
cout<<"输入初始值:";
cin>>x0;
do
{
k++;
x1=F(x0);
D_value=fabs(x1-x0);
x0=x1;
}
while((D_value>0.000005)&&(k<=N));
if(k<N)
cout<<x1<<" "<<k<<endl;
else
cout<<"计算失败!"<<endl;
}
存在一定的问题,请帮忙修改谢谢,如果知道错误的原因,也写出来吧!谢谢!
可以将正确的源程序发送至godisacoolboy@gmail.com,谢谢,不甚感激!

数值分析课程的上机作业:

/*
*******************************************************************************
* Algorithm

* Abstract:
* 本程序使用 Newton 迭代法计算多项式函数的近似根,并可确定收敛域。
* 可以定制的参数有:多项式函数的次数及各项系数、允许误差、初值、确定收敛域时的步进值、需求的近似根数目。
* 参数可以选择由终端输入或由文件输入,计算结果将显示于终端,并写入输出文件。
* 通过对 root_finding 函数的简单修改,可以实现对所给初值仅计算近似根或是一并寻找收敛域的选择。
* 选择计算近似根并寻找收敛域时,请注意该精确根的收敛域是否为无穷区间。
* Notes :
* 由于时间与精力有限,只实现了当初值大于精确值时寻找收敛域的算法,初值小于精确值时的算法未实现。
* 计算近似根时,最后一次迭代结果与前一次迭代结果将一并显示以供比较。
* 寻找收敛域时,每增加一个步进值,所得结果均将显示。
* 寻找收敛域时,若计算无休止进行,则说明该精确根的收敛域为无穷区间。
* Reference:
*
* Author:
* Qiu Jun 2007-06-04
* Revision History:
* Qiu Jun 2007-06-04 Initiated Version
*******************************************************************************
*/

/*
*******************************************************************************
* ANSI C Source Code

* File Name:
* 2_20.c
* Abstract:
* 习题 2 第 20 题(上机题):Newton 迭代法计算多项式函数近似根
* Reference:
*
* Author:
* Qiu Jun 2007-06-04
* Revision History:
* Qiu Jun 2007-06-04 Initiated Version
*******************************************************************************
*/

/*
*******************************************************************************
* Include Files
*******************************************************************************
*/
#include <stdio.h>
#include <math.h>

/*
*******************************************************************************
* Constants and Define Declarations
*******************************************************************************
*/
#define max_items 10 // 允许的多项式项数
#define max_times 100 // 允许的最大迭代次数

/*
*******************************************************************************
* Global Object Definition
*******************************************************************************
*/
int n; // 多项式阶数
int root_amount; // 需求的近似根数目
double e; // 允许误差
double step; // 寻找 delta 的每次步进值
static double a[max_items]; // 多项式系数数组
static double x[max_items-1][max_times]; // 迭代结果数组
enum {no,yes} convergence; // 收敛性

/*
*******************************************************************************
* Function Definition
*******************************************************************************
*/

/*
*******************************************************************************
* Function Name:
* parameter_input
* Description:
* 参数输入
* Input:
*
* Output:
*
* Function Reference:
*
* Author:
* Qiu Jun 2007-05-30 Created
*******************************************************************************
*/
void parameter_input(file_input,file_output)
FILE *file_input;
FILE *file_output;
{
int i;

/* 由键盘输入参数 */
/* printf("\nPlease Input:\n");
printf("****************************************************************\n");

printf("Rank of Polynomial : ");
scanf("%d",&n);

printf("Factors : ");
for (i=0; i<n+1; i++)
{
scanf("%lf",&a[i]);
}

printf("e : ");
scanf("%lf",&e);

printf("step : ");
scanf("%lf",&step);

printf("Amount of Roots : ");
scanf("%d",&root_amount);

printf("****************************************************************\n\n");
*/

/* 由文件输入参数 */
fscanf(file_input,"%d",&n);
for (i=0; i<n+1; i++)
{
fscanf(file_input,"%lf",&a[i]);
}
fscanf(file_input,"%lf",&e);
fscanf(file_input,"%lf",&step);
fscanf(file_input,"%d",&root_amount);

/* 输出参数至终端 */
printf("\nThe Parameters are:\n");
printf("***********************************************************************\n");
printf("Rank of Polynomial : %d\n",n);
printf("Factors a[0]->a[n] : ");
for (i=0; i<n+1; i++)
{
printf("%f ",a[i]);
}
printf("\n");
printf("e : %f\n",e);
printf("step : %f\n",step);
printf("***********************************************************************\n\n");

/* 输出参数至文件 */
fprintf(file_output,"\nThe Parameters are:\n");
fprintf(file_output,"***********************************************************************\n");
fprintf(file_output,"Rank of Polynomial : %d\n",n);
fprintf(file_output,"Factors a[0]->a[n] : ");
for (i=0; i<n+1; i++)
{
fprintf(file_output,"%f ",a[i]);
}
fprintf(file_output,"\n");
fprintf(file_output,"e : %f\n",e);
fprintf(file_output,"step : %f\n",step);
fprintf(file_output,"***********************************************************************\n\n");
}

/*
*******************************************************************************
* Function Name:
* f
* Description:
* 计算多项式函数 f(x) 的值
* Input:
* xk : 自变量
* Output:
* fx : 函数值
* Function Reference:
*
* Author:
* Qiu Jun 2007-05-30 Created
*******************************************************************************
*/
double f(xk)
double xk;
{

int i;
double x;
double fx;
double item;

x=1;
fx=0;
for (i=0; i<n+1; i++)
{
item=a[i]*x;
fx=fx+item;
x=x*xk;
}
return(fx);
}

/*
*******************************************************************************
* Function Name:
* df
* Description:
* 计算多项式函数 f(x) 的导函数 f'(x) 的值
* Input:
* xk : 自变量
* Output:
* dfx : 函数值
* Function Reference:
*
* Author:
* Qiu Jun 2007-05-30 Created
*******************************************************************************
*/
double df(xk)
double xk;
{
int i;
double x;
double dfx;
double item;

x=1;
dfx=0;
for (i=1; i<n+1; i++)
{
item=i*a[i]*x;
dfx=dfx+item;
x=x*xk;
}
return(dfx);
}

/*
*******************************************************************************
* Function Name:
* calculate_one
* Description:
* 使用 Newton 迭代法计算近似根
* Input:
*
* Output:
*
* Function Reference:
*
* Author:
* Qiu Jun 2007-05-30 Created
*******************************************************************************
*/
void calculate_one(i,file_output)
int i;
FILE *file_output;
{
int j; // 迭代次数
double e_present; // 本次迭代误差
double e_previous; // 前次迭代误差

j=0;

/* Newton 迭代法 */
do
{
x[i][j+1]=x[i][j]-f(x[i][j])/df(x[i][j]);
e_present=fabs(x[i][j+1]-x[i][j]);
if (j!=0)
e_previous=fabs(x[i][j]-x[i][j-1]);
else e_previous=e_present;
if (e_present>e_previous)
convergence=no;
j++;
}
while (e_present>e&&convergence);

/* 输出结果至终端 */
printf("***********************************\n");
printf("Initial Value of x : %f\n",x[i][0]);
printf("Times of Iteration : %d\n",j);
printf("x[%d][%d] : %f\n",i,j,x[i][j]);
printf("x[%d][%d] : %f\n",i,j-1,x[i][j-1]);
printf("Convergence : ");
switch (convergence)
{
case no : printf("No\n"); break;
case yes : printf("Yes\n"); break;
default : break;
}
printf("***********************************\n\n");

/* 输出结果至文件 */
fprintf(file_output,"***********************************\n");
fprintf(file_output,"Initial Value of x : %lf\n",x[i][0]);
fprintf(file_output,"Times of Iteration : %d\n",j);
fprintf(file_output,"x[%d][%d] : %f\n",i,j,x[i][j]);
fprintf(file_output,"x[%d][%d] : %f\n",i,j-1,x[i][j-1]);
fprintf(file_output,"Convergence : ");
switch (convergence)
{
case no : fprintf(file_output,"No\n"); break;
case yes : fprintf(file_output,"Yes\n"); break;
default : break;
}
fprintf(file_output,"***********************************\n\n");
}

/*
*******************************************************************************
* Function Name:
* root_finding
* Description:
* 计算近似根及寻找收敛域
* Input:
*
* Output:
*
* Function Reference:
*
* Author:
* Qiu Jun 2007-05-30 Created
*******************************************************************************
*/
void root_finding(file_input,file_output)
FILE *file_input;
FILE *file_output;
{
double f();
double df();

int i; // 根数

for (i=0; i<root_amount; i++)
{
/* 由键盘输入初值 */
printf("No.%d Root :\n\n",i+1);
printf("Initial Value of x : ");
scanf("%lf",&x[i][0]);
printf("\n");

/* 由文件输入初值 */
/* fscanf(file_input,"%lf",&x[i][0]);
*/
convergence=yes;

/* 计算近似根 */
/* calculate_one(i,file_output);
*/
/* 计算近似根并寻找收敛域 */
do
{
calculate_one(i,file_output);

if (convergence)
x[i][0]=x[i][0]+step;
}
while (convergence);
}
}

/*
*******************************************************************************
* Main Function Definition
*******************************************************************************
*/

/*
*******************************************************************************
* Function Name:
* main
* Description:
* 利用 Newton 迭代法计算多项式函数近似根
* Input:
*
* Output:
*
* Function Reference:
*
* Author:
* Qiu Jun 2007-05-30 Created
*******************************************************************************
*/
void main(void)
{
void parameter_input();
void root_finding();

FILE *file_input;
FILE *file_output;

file_input=fopen("file_input.txt","r");
file_output=fopen("file_output.txt","w");

parameter_input(file_input,file_output);
root_finding(file_input,file_output);

fclose(file_input);
fclose(file_output);
}

http://hi.baidu.com/roadtowimax/blog/item/0ed406a8645364b0ca130c26.html
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-03-17
x+6=0在0附近的实根.程序如下:
#include<math.h>
#include<stdio.h>
float f(float x)
{
return (x*x*x-2*x*x-5*x+6);
}
float f1(float x)
{
return (3*x*x-4*x-5);
}
void main()
{
float x1=0,x;
clrscr();
do
{
x=x1;
x1=x-f(x)/f1(x);
}while(fabs(x1-x)>0.0001);
printf("x=%f\n",x1);
}
第2个回答  推荐于2018-04-19
#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;
}
}
//你的程序其实没问题,牛顿迭代法本身循环一次只能找到一个答案,只要再建一个循环控制使
//用迭代法的次数和判断根的个数就行。我又加了一个判断是否有重复的根的循环。
//希望能对你有所帮助。本回答被提问者和网友采纳

用牛顿迭代法求多项式的根(C\/C++语言)
* 本程序使用 Newton 迭代法计算多项式函数的近似根,并可确定收敛域。* 可以定制的参数有:多项式函数的次数及各项系数、允许误差、初值、确定收敛域时的步进值、需求的近似根数目。* 参数可以选择由终端输入或由文件输入,计算结果将显示于终端,并写入输出文件。* 通过对 root_finding 函数的简单修改,可以实现对所给...

C++用牛顿迭代法求根。方程为ax^3+bx^2+cx+d=0。系数a,b,c,d由主函 ...
f=((a*x0+b)*x0+c)*x0+d;是用来求f在第i+1次迭代时的,在xi处的值,这里f(x)是一个3次多项式,即 f1=(3*a*x0+2*b)*x0+c;f1是用来求第i+1次迭代时,f在xi处的导数,而f在x处的导数为 而循环结束一般是误差在某个范围内,就认为得到解了,所以是 while(fabs(x-x0)>1...

python牛顿法求多项式的根
cout<<"方程的一个根:"<<x1<<","<<" 迭代次数为:"<<k<<endl;y[count]=x1;count++;} \/\/else \/\/cout<<"计算失败!"<<endl;} } \/\/你的程序其实没问题,牛顿迭代法本身循环一次只能找到一个答案,只要再建一个循环控制使 \/\/用迭代法的次数和判断根的个数就行。我又加了一个判断是否...

因式分解x^5+x-1?
牛顿迭代法可以用来寻找函数零点,因此可以用来找到多项式的根。对于多项式 $f(x) = x^5 + x - 1$,我们可以考虑对其进行牛顿迭代。设 $x_0$ 是多项式的一个近似根,我们可以通过以下递推公式来求解 $x_{n+1}$:x_{n+1} = x_n - \\frac{f(x_n)}{f'(x_n)} 其中 $f'(x)$ ...

求用C或C++语言计算平方根,要求不使用SQRT函数
一般我们求平方根使用牛顿迭代法,实现代码如下:double newtonMethod(double toBeSqrted) { double x = 1.0; while(abs(x * x - toBeSqrted) > 1e-5) { x = (x + toBeSqrted \/ x) \/ 2; } return x;}还可以用二分查找,这个原理较为简单,不过算法复杂度较高。flo...

爆肝期末!7道代码实验吃透《计算方法》(C++)
题目一:运用二分法求解方程 f(x) = x^3 + 10x - 20 在区间 [1, 2] 内的根,精确度要求达到 10^-4。代码实现:(省略代码实现,直接给出核心逻辑)题目二:使用牛顿迭代法求解方程 exp(x) - 3 - x 在初始点 x0 = 2 处的根,输出每次迭代结果并统计迭代次数,精度要求为 10^-5。代...

在解析特征多项式时,需要使用什么特定方法?
2. 因式分解法:因式分解法是将多项式分解为若干个较简单的因子,然后分别求解每个因子的根。这种方法适用于具有重复因子的多项式,可以大大减少求解的复杂度。3. 牛顿迭代法:牛顿迭代法是一种基于泰勒级数的迭代求解方法,它通过不断迭代来逼近多项式的根。这种方法适用于较大的多项式,但需要选择合适的...

牛顿迭代收敛定理的应用有哪些经典案例?
1.牛顿迭代法在求根中的应用:牛顿迭代法可以用于求解非线性方程的根,例如求解多项式方程、指数方程等。通过不断迭代,可以得到方程的近似解。2.牛顿迭代法在优化问题中的应用:牛顿迭代法也可以用于求解优化问题,例如求解最大值或最小值。通过不断迭代,可以得到目标函数的近似最优解。3.牛顿迭代法在...

求C语言 牛顿迭代法 程序~~~
用牛顿迭代法求方程 x*x*x-2*x*x-5*x+6=0在0附近的实根.程序如下:#include<math.h>#include<stdio.h>float f(float x){ return (x*x*x-2*x*x-5*x+6);}float f1(float x){ return (3*x*x-4*x-5);}void main(){ float x1=0,x; clrscr(); do { x=x1; x1=x-f(x)\/f1(x...

求“牛顿迭代法”是什么?
牛顿迭代法是一种求解方程根的高效方法,尤其在方程f(x)=0的单根附近具有显著优势。通过计算迭代过程中的x值,牛顿迭代法能够快速收敛至根点。这种方法不仅适用于单根问题,还能处理方程的重根与复根。在处理重根和复根时,牛顿迭代法则表现为线性收敛,但通过特定技巧可以提升至超线性收敛,进一步提升求解...

相似回答