【问题标题】:Newton-Raphson Algorithm牛顿-拉夫森算法
【发布时间】:2014-03-19 07:07:35
【问题描述】:

我将编译并运行此程序以使用 Newton-Raphson 算法求解方程,但 do-while 循环中的迭代次数始终为 1,不应该是这种情况。

代码

#include<math.h>
#include<stdio.h>

float fonc(float x){
   float result;
   result=2*(pow(x,3))-x-2;
   return result;
 }

float foncprime(float x){
   float result;
   result= 6*(pow(x,2))-1;
   return result;
}

int main(void)
{
   long double x1,x0;
   float eps;
   eps=0.5*pow(10,-4);
   x0=1;
   x1=1;
   int i=0;
   do
   {
      x0=x1;
      x1=x0-(fonc(x0)/foncprime(x0));
      i++;

   }
   while(x1-x0>eps);
   printf("%d",i);
}

【问题讨论】:

  • 不要养成使用pow 计算整数幂的习惯。将x*x 用于x 平方,x*x*x 用于x 立方,5E-5 用于5/100000(或0.5E-4,如果您愿意的话。)pow 慢很多,有时准确度稍差.
  • @rici 我很感激你的建议永远不会忘记谢谢。

标签: c algorithm


【解决方案1】:

你应该检查一下while (fabs(x1-x0) &gt; eps)

【讨论】:

    【解决方案2】:

    您在 while 循环测试之前已将 x1 分配给 x0,因此测试为 0>eps,这将始终为假,因此它在第一次迭代时退出循环。

    【讨论】:

    • 那么解决方案是什么?我在哪里可以分配它
    • 我不太了解该方法,但假设您想在分配之前测试 x1-x0,我会将分配移动到循环的开头并将初始 x0=1 更改为 x1 =1 以确保它们以正确的值开始。在没有完全理解数学的情况下,这是一个猜测。
    • 是的,我只是这样做了,但它仍然无法正常工作,结果仍然相同
    • 按照其他答案尝试 fabs(x1-x0)
    • 在整个过程中使用双精度(或长双精度)而不是混合精度也是一个好主意。
    【解决方案3】:

    变化:

       while(x1-x0>eps);
    

    到:

       while(fabs(x1-x0)>eps);
    

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2012-04-18
      • 2015-03-04
      • 1970-01-01
      相关资源
      最近更新 更多