这是一个问题:
编写一个程序,以使用 secant方法来查找以下方程的真正根源:
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("%lfn", x_1);
printf("%lfn", 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 %lfn", x_2);
printf("%d iterations were required to compute itn", 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;
}
我的代码问题是,它不适用于与0
和1
不同的任何其他输入。
我看不到代码有什么问题,我添加了一个绝对错误的代码,并且该公式对我来说是正确的。对我来说,有不同的初始猜测,返回的根部是不同的,并且永远循环。
我想知道这是一个编码错误还是数学错误。还是根振荡?我只是不知道我的程序怎么了。谁能帮我吗?谢谢。
您的中点公式已关闭。它似乎是公式的两个变体的混合物。靠近衍生的公式作为割线线的根
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)).
使用牛顿 - 霍纳特技巧,您可以获得多项式的较短公式,
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
。