求五次多项式的一个根的代码
A code for finding one root of fifth degree polynomial
我正在尝试编写一个代码,要求用户为 5 次多项式提供 5 个系数,它还要求提供程序检查是否存在解决方案的范围(两个值)是否在其中(我被要求只找到一个),并且解决方案必须是整数,而系数可以是浮点数。
我正在考虑编写一个代码,遍历范围内的每个整数,并将其替换为我定义的多项式的描述,并检查它是否等于零,但我无法决定如何制作循环。
还有一件事,如果用户输入的区间中有多个根,那么我们必须打印根的最小值(但我也不知道该怎么做)。
我会向您展示我到目前为止所写的内容,如有任何帮助,我们将不胜感激:
#include <stdio.h>
#define zero 0.00001
int main()
{
double a, b, c , d , e , f , y , beginning_of_range, end_of_range;
int x;
printf("please enter the coefficients of the polynomial:\n");
scanf("%lf%lf%lf%lf%lf", &a, &b, &c, &d, &e);
printf("please enter two values to indicate the beginning and end of range:\n");
scanf("%lf%lf", &beginning_of_range, &end_of_range);
while (beginning_of_range > end_of_range)
{
printf("ERROR: the range you have entered isn't valid, please try again:");
scanf("%lf%lf", &beginning_of_range, &end_of_range);
}
while (beginning_of_range < end_of_range)
{
x = beginning_of_range;
y = a + b*x + c*x*x + d*x*x*x + e*x*x*x*x + f*x*x*x*x*x;
if (y == zero)
{
printf("the root is:%d", x);
}
else
{
x = x+1;
}
break;
}
return 0;
}
您的第一个 while 循环可能应该是 if 语句而不是循环。
你的第二个(主)while 循环从不递增范围的开始。这可能导致你死循环。
您所写的任务非常有问题,以至于可能存在误解或传达错误。
具有浮点系数的随机给定多项式将具有概率接近于零的整数根,这实际上是不可能的。
即使使用整数系数,也需要仔细对系数进行逆向工程才能获得整数根。只需将系数一个一个地改变,在大多数情况下所有根都是无理根。
您可以在您的框架中做的是找到符号变化的区间,以便区间内至少有一个根可以使用二分法、正则法西法、伊利诺斯法、正割法或 Mullers 方法之一找到。所有这些都没有衍生品。
如果不识别所有的根,包括复杂的根,则很难保证找到所有真正的根。因此,只能近似地找到给定区间内的最小实根。可能存在一个内部有两个实根的整数区间,因此在边界处符号相同。在这种情况下,您必须分析整数点处所有导数的符号才能做出更可靠的猜测,请参阅笛卡尔规则和 Budan-Fourier 定理。
我正在尝试编写一个代码,要求用户为 5 次多项式提供 5 个系数,它还要求提供程序检查是否存在解决方案的范围(两个值)是否在其中(我被要求只找到一个),并且解决方案必须是整数,而系数可以是浮点数。
我正在考虑编写一个代码,遍历范围内的每个整数,并将其替换为我定义的多项式的描述,并检查它是否等于零,但我无法决定如何制作循环。
还有一件事,如果用户输入的区间中有多个根,那么我们必须打印根的最小值(但我也不知道该怎么做)。
我会向您展示我到目前为止所写的内容,如有任何帮助,我们将不胜感激:
#include <stdio.h>
#define zero 0.00001
int main()
{
double a, b, c , d , e , f , y , beginning_of_range, end_of_range;
int x;
printf("please enter the coefficients of the polynomial:\n");
scanf("%lf%lf%lf%lf%lf", &a, &b, &c, &d, &e);
printf("please enter two values to indicate the beginning and end of range:\n");
scanf("%lf%lf", &beginning_of_range, &end_of_range);
while (beginning_of_range > end_of_range)
{
printf("ERROR: the range you have entered isn't valid, please try again:");
scanf("%lf%lf", &beginning_of_range, &end_of_range);
}
while (beginning_of_range < end_of_range)
{
x = beginning_of_range;
y = a + b*x + c*x*x + d*x*x*x + e*x*x*x*x + f*x*x*x*x*x;
if (y == zero)
{
printf("the root is:%d", x);
}
else
{
x = x+1;
}
break;
}
return 0;
}
您的第一个 while 循环可能应该是 if 语句而不是循环。
你的第二个(主)while 循环从不递增范围的开始。这可能导致你死循环。
您所写的任务非常有问题,以至于可能存在误解或传达错误。
具有浮点系数的随机给定多项式将具有概率接近于零的整数根,这实际上是不可能的。
即使使用整数系数,也需要仔细对系数进行逆向工程才能获得整数根。只需将系数一个一个地改变,在大多数情况下所有根都是无理根。
您可以在您的框架中做的是找到符号变化的区间,以便区间内至少有一个根可以使用二分法、正则法西法、伊利诺斯法、正割法或 Mullers 方法之一找到。所有这些都没有衍生品。
如果不识别所有的根,包括复杂的根,则很难保证找到所有真正的根。因此,只能近似地找到给定区间内的最小实根。可能存在一个内部有两个实根的整数区间,因此在边界处符号相同。在这种情况下,您必须分析整数点处所有导数的符号才能做出更可靠的猜测,请参阅笛卡尔规则和 Budan-Fourier 定理。