Camellia.332 2023-03-07 16:58 采纳率: 92.3%
浏览 147
已结题

牛顿迭代法求方程2x³-4x²+3x-6=0在1.5附近的结果

在运用牛顿迭代法的过程中出现了一些问题
题目:用牛顿迭代法求方程2x³-4x²+3x-6=0在1.5附近的结果。
以下几种方法希望可以帮我看看错在哪里呀www
虽然差别都很小,但是我很多细节不太理解
方法一:
do while结果为2.3333333

#include<iostream>
using namespace std;
#include<math.h>
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附近的结果为:" <<x<<endl;

}
 
 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<iostream>
using namespace std;
#include<math.h>
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附近的结果为" <<x1<<endl;
    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<iostream>
using namespace std;
#include<math.h>

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<iostream>
using namespace std;
#include<math.h>

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;

}

  • 写回答

3条回答 默认 最新

  • CQ.abc 2023-03-07 17:09
    关注

    首先需要注意的是,题目中给出的方程为 $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

    和方法二中的代码基本一致,只是多了一些赋值操作,但也不影响结果。

    所以,可以选择方法二或方法四作为正确的代码。
    回答不易,望采纳!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月10日
  • 已采纳回答 3月7日
  • 创建了问题 3月7日

悬赏问题

  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥100 已有python代码,要求做成可执行程序,程序设计内容不多
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答
  • ¥20 在本地部署CHATRWKV时遇到了AttributeError: 'str' object has no attribute 'requires_grad'