在运用牛顿迭代法的过程中出现了一些问题
题目:用牛顿迭代法求方程2x³-4x²+3x-6=0在1.5附近的结果。
以下几种方法希望可以帮我看看错在哪里呀www
虽然差别都很小,但是我很多细节不太理解
方法一:
do while结果为2.3333333
#include
using namespace std;
#include
double fun(double x,double a,double b,double c,double d);
double dfun(double x,double a,double b,double c,double d);
int main()
{double a,b,c,d;
double fun(double x,double a,double b,double c,double d);
double dfun(double x,double a,double b,double c,double d);
cin>>a>>b>>c>>d;
double f,df;
double x=1.5,x2,h;
do
{
x2=x;
f= fun(x,a,b,c,d);
df= dfun(x,a,b,c,d);
h=double(f/df);
x2=x-h;
x=x2;
}while(fabs(x2-x)>=1e-5);
cout<<"方程在1.5附近的结果为:" <double fun(double x,double a,double b,double c,double d){
double f;
f=a*x*x*x+b*x*x+c*x+d;
return f;
}
double dfun(double x,double a,double b,double c,double d){
double df;
df=3*a*x*x+2*b*x+c;
return df;
}
方法二:
while结果是2
#include
using namespace std;
#include
double fun(double x,double a,double b,double c,double d);
double dfun(double x,double a,double b,double c,double d);
int main(){
double a,b,c,d;
cin>>a>>b>>c>>d;
double x1=1.5,x2;
x2=x1-fun(x1,a,b,c,d)/dfun(x1,a,b,c,d);
while(fabs(x1-x2)>=1e-6)
//while是当条件不满足时才进行循环,所以这里应该是题目中要求的范围的补集
{
x1=x2;
x2=x1-fun(x1,a,b,c,d)/dfun(x1,a,b,c,d);
}
cout<<"方程在1.5附近的结果为" <return 0;
}
double fun(double x,double a,double b,double c,double d){
double f=a*x*x*x+b*x*x+c*x+d;
return f;
}
double dfun(double x,double a,double b,double c,double d){
double df=3*a*x*x+2*b*x+c;
return df;
}
方法三:dowhile结果也是2
#include
using namespace std;
#include
double fun(double x, double a, double b, double c, double d)
{
double f;
f = double(a * x * x * x + b * x * x + c * x + d);
return f;
}
double dfun(double x, double a, double b, double c, double d)
{
double df;
df = double(3 * a * x * x + 2 * b * x + c);
return df;
}
int main()
{
double a, b, c, d;
cin >> a >> b >> c >> d;
double f, df, h;
double x = 1.5, x0;
do
{
x0 = x;
f = fun(x0,a,b,c,d);
df = dfun(x0,a,b,c,d);
h = double(f / df);
x = x0 - h;
} while (fabs(x-x0) >= 1e-5);
cout << "方程在1.5附近的结果为:" << x << endl;
}
方法四:while结果也是2
#include
using namespace std;
#include
double fun(double x, double a, double b, double c, double d)
{
double f;
f = double(a * x * x * x + b * x * x + c * x + d);
return f;
}
double dfun(double x, double a, double b, double c, double d)
{
double df;
df = double(3 * a * x * x + 2 * b * x + c);
return df;
}
int main()
{
double a, b, c, d;
cin >> a >> b >> c >> d;
double f, df, h;
double x = 1.5, x0;
x0 = x;
f = fun(x0, a, b, c, d);
df = dfun(x0, a, b, c, d);
h = double(f / df);
x = x0 - h;
while (fabs(x - x0) >= 1e-5)
{
x0 = x;
f = fun(x0,a,b,c,d);
df = dfun(x0,a,b,c,d);
h = double(f / df);
x = x0 - h;
}
cout << "方程在1.5附近的结果为:" << x << endl;
}
首先需要注意的是,题目中给出的方程为 $2x^3-4x^2+3x-6=0$,而在你的代码中使用的是 $ax^3+bx^2+cx+d=0$ 的形式。因此,在代码中需要将 $a=2, b=-4, c=3, d=-6$ 代入函数中。
接下来看你的四个方法:
方法一:do-while
代码中的迭代公式和牛顿迭代法的公式是一致的,不过终止条件的判断有些问题。因为绝对值取的是 $|x_2-x|$,所以当 x2 比 x 小时,绝对值中的值为正数,而当 x2 比 x 大时,绝对值中的值为负数,因此不满足循环条件,导致循环不断进行。应该改为 $|x_2-x|<\epsilon$ 才跳出循环,$\epsilon$ 可以取较小的数,如 $1e-6$。
方法二:while
这个方法中的迭代公式和终止条件都是正确的。
方法三:do-while
和方法一中的问题类似,绝对值取的是 $|x-x_0|$,同样需要改为 $|x-x_0|<\epsilon$ 才跳出循环。
方法四:while
和方法二中的代码基本一致,只是多了一些赋值操作,但也不影响结果。
所以,可以选择方法二或方法四作为正确的代码。
回答不易,望采纳!
第一段是错误的
x=x2;
}while(fabs(x2-x)>=1e-5);
在while之前,你将x=x2,而while判断x2-x的绝对值,那肯定是0啊,循环只执行一次就结束了