割线法求多项式根的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