用于求多项式根的割线方法的C程序

时间:2017-03-01 01:56:45

标签: c math

以下是问题:

编写一个程序,使用Secant method找到以下等式的真正根源:

f(x) = 23x^4 -13x^3 + 3x^2 - 5x + 38

h = r(i) - r(i-1),其中r(i)是在程序的迭代i中计算的根。您的程序应继续优化其答案,直至h < 10 - 3。该值称为收敛标准。您的程序应该打印根的最终值和计算它所需的迭代次数。

这是我的计划:

#include <stdio.h>

double function ( double i );

int main ()
{
    double x_1, x_2, h_x, temp, a, b;

   int count = 0;

   printf("Enter first approximation: ");
   scanf("%lf", &x_1);

   printf("Enter second approximation: ");
   scanf("%lf", &x_2);

   a = function ( x_1 );
   b = function ( x_2 );

   h_x = x_2 - x_1;

   if ( h_x < 0 )
        {
           h_x = ( h_x < 0 )? - h_x: h_x;
        }

   while ( h_x >= ( 1.E-3 ) && count <= 999999999 )
   {
    a = function ( x_1 );
    b = function ( x_2 );
    temp = ( ( x_1 * b ) - ( x_2 * a ) / ( b - a ) );
    x_1 = x_2;
    x_2 = temp;

    printf("%lf\n", x_1);
    printf("%lf\n", x_2);

    count += 1;
    h_x = x_2 - x_1;

    if ( h_x < 0 )
    {
        h_x = ( h_x < 0 )? - h_x: h_x;
    }

}

printf("Final value of root is %lf\n", x_2);
printf("%d iterations were required to compute it\n", count);

return 0;
 }


 double function ( double i )
 {
     double result;

   result = ( 23 * i * i * i * i ) - ( 13 * i * i * i ) + ( 3 * i * i ) - ( 5 * i ) + 38;

   return result;
 }

我的代码存在的问题是,它不适用于与01不同的任何其他输入。

我没看到我的代码有什么问题,我已经添加了绝对错误的代码,公式看起来对我来说。对我而言,通过不同的初始猜测,返回的根是不同的,并且只是永远循环,这是不符合逻辑的。

我只想知道它是编码错误还是数学错误。还是根源振荡?我只是不知道我的程序有什么问题。谁能帮我吗?感谢。

1 个答案:

答案 0 :(得分:0)

您的中点公式已关闭。它似乎是两种配方变体的混合物。该公式接近以割线为根的推导

y = f(x_2)+(x-x2) * (f(x2)-f(x1))/(x2-x1)

给出

x3 = x2 - f(x2)*(x2-x1)/(f(x2)-f(x1)).

将所有内容整合到一个分数中会得到等价的

x3 = (x1*f(x2) -x2*f(x1)) / (f(x2)-f(x1)).

使用Newton-Horner技巧获得更短的多项式公式

f(x) = ((( 23 * x  -  13 ) * x + 3 ) * x -  5 ) * x + 38.

你应该避免重复计算相同的数量,即使这里没有任何明显的影响。为值f(x1)f(x2)声明变量。

使用绝对值功能计算绝对值。 hx = fabs(x2-x1)。或使用hx=(hx<0)?-hx:hx;来避免包含math.h