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

牛顿迭代法求方程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 09: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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    Camellia.332 2023-03-07 09:23

    感谢🙏

    回复
    Camellia.332 2023-03-07 09:34

    我想问一下这个第三种方法为啥我觉得判断条件没问题呢?可以再和我解释一下吗 🥹

    回复
    CQ.abc 回复 Camellia.332 2023-03-07 11:10

    当使用do-while循环时,它会首先执行一次循环体,然后根据循环条件的真假来决定是否继续执行循环。在这个特定的例子中,循环体中包含对牛顿迭代法的求解步骤,它首先计算函数和函数导数的值,然后计算牛顿迭代法中的步长,并将步长应用到上一步迭代的结果上,得到新的近似解。 在每次迭代之后,do-while循环检查条件fabs(x-x0)>=1e-5是否满足。如果满足条件,则继续执行循环,否则退出循环,将最终的近似解输出。 与其他三个方法相比,方法三的主要区别是使用do-while循环而不是while循环,这会导致在求解过程中至少执行一次循环,无论是否满足循环条件。

    回复
    展开全部4条评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 matlab中频率调制法代码的解读
  • ¥15 ceph的对象、块、文件相关问题求解答
  • ¥50 如果使用python进行ERA5 10米风场预报检验
  • ¥15 navicat解析mysql密码
  • ¥15 SDAPI(关键词-table)
  • ¥15 unity安卓打包出现问题
  • ¥20 安装catkin时遇到了如下问题请问该如何解决呢
  • ¥15 VAE模型如何输出结果
  • ¥15 编译python程序为pyd文件报错:{"source code string cannot contain null bytes"
  • ¥20 关于#r语言#的问题:广义加行模型拟合曲线后如何求拐点
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部