gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:25:00 24 4
gpt4 key购买 nike

问题是:

编写一个程序,使用 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;
}

我的代码的问题是它不适用于与 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)).

您可以使用 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 .

关于正割法求多项式根的C程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42521863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com