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

割线法求多项式根的C程序,c,math,C,Math,问题是: 编写一个程序,使用以下公式求出以下方程的实根: f(x)=23x^4-13x^3+3x^2-5x+38 设h=r(i)-r(i-1),其中r(i)是在程序的迭代i中计算的根。您的程序应该继续优化其答案,直到h

问题是:

编写一个程序,使用以下公式求出以下方程的实根:

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;
 }
#包括
双功能(双i);
int main()
{
双x_1,x_2,h_x,温度,a,b;
整数计数=0;
printf(“输入第一近似值:”);
扫描频率(“%lf”和x_1);
printf(“输入第二近似值:”);
扫描频率(“%lf”和x_2);
a=函数(x_1);
b=函数(x_2);
h_x=x_2-x_1;
if(h_x<0)
{
h_x=(h_x<0)?-h_x:h_x;
}

而(h_x>=(1.E-3)&&count你的中点公式是关闭的。它似乎是该公式的两个变体的混合体。该公式作为正割线的根靠近导数

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

把所有的东西都归为一个分数,就得到了相等的结果

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

用牛顿-霍纳技巧得到多项式的一个较短公式

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

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



使用绝对值函数来计算绝对值。
hx=fabs(x2-x1)
。或者使用
hx=(hx您的中点公式处于关闭状态。它似乎是公式的两个变体的混合。靠近导数的公式作为正割线的根

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

把所有的东西都归为一个分数,就得到了相等的结果

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

用牛顿-霍纳技巧得到多项式的一个较短公式

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

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



使用绝对值函数来计算绝对值。
hx=fabs(x2-x1)
。或者使用
hx=(hx您是否尝试在每次迭代后打印出
h_x
?其他提示:为什么要写
(0.1*0.1*0.1)
而不仅仅是
1.E-3
?当你发现
h_x
是<0时,为什么要重新计算它而不仅仅是
h_x=-h_x;
?希望编译器可以优化函数(),但你可以使用'y-38+(x*-5+(x*3+…);我已经用你的一些建议编辑了上面的代码。但是,它仍然不起作用。我想知道这个程序是否适用于复数根,因为这个多项式的根似乎很复杂。谢谢!不,使用实数方法只能找到实数根。你可能会使用Bairstows方法得到结果,因为finds二次因子,因此也包括成对的复数共轭根。或者使用
复数双
数据类型,使用相移函数
f(x)*exp(i*0.001*x)从实际初始值获得复数根
。是的,这非常令人困惑。这是一个家庭作业问题,他要求我们使用割线法来解决。因此,这里不能使用Bairstows法。我已经向TA提出了这个问题,他稍后会给我回复。谢谢你的帮助!你在每次迭代后都试着打印出
h\x
了吗?其他提示:为什么要编写
(0.1*0.1*0.1)
而不仅仅是
1.E-3
?当你发现
h_x
是<0时,为什么要重新计算它而不仅仅是
h_x=-h_x;
?希望编译器可以优化函数(),但你可以使用'y-38+(x*-5+(x*3+…);我已经用你的一些建议编辑了上面的代码。但是,它仍然不起作用。我想知道这个程序是否适用于复数根,因为这个多项式的根似乎很复杂。谢谢!不,使用实数方法只能找到实数根。你可能会使用Bairstows方法得到结果,因为finds二次因子,因此也包括成对的复数共轭根。或者使用
复数双
数据类型,使用相移函数
f(x)*exp(i*0.001*x)从实际初始值获得复数根
。是的,这非常令人困惑。这是一个家庭作业问题,他要求我们使用割线法。因此,这里不能使用Bairstows法。我已经向TA提出了这个问题,他稍后会给我回复。谢谢你的帮助!谢谢你的帮助!我已经根据你的建议编辑了代码(见上文).但是,现在输出值为-1.#IND00。我的助教还说,两个初始根不能是随机的,必须接近根的实际值。如果我编写一个程序来近似它,我想知道如何找到实际根?再次感谢!当然,如果没有根可以找到,您的程序将无限期地搜索。使用WolframAlpha或专用小程序喜欢发现所有根都是复杂的,
0.9382335836057213+-0.7594072313917729 i
-0.6556248879535475+-0.8391223634916823 i
。感谢您的帮助!我已经根据您的建议编辑了代码(见上文).但是,现在输出值为-1.#IND00。我的助教还说,两个初始根不能是随机的,必须接近根的实际值。如果我编写一个程序来近似它,我想知道如何找到实际根?再次感谢!当然,如果没有根可以找到,您的程序将无限期地搜索。使用WolframAlpha或专用小程序喜欢发现所有根都是复杂的,
0.9382335836057213+-0.7594072313917729 i
-0.65562488795375+-0.8391223634916823