为什么这段牛顿方法的代码在 C 中不起作用(使用 while 循环)?
Why does this code for newton's method not work in C (using a while loop)?
#include <stdio.h>
#include <math.h>
int main()
{
// ax^3 + bx^2 + cx + d = 0
float a,b,c,d,guess,derivative;
double functional_value, accuracy;
printf("Please enter values for a,b,c,d respectively :\n");
scanf("%f %f %f %f", &a, &b, &c, &d);
printf("Please enter your best guess for a root:\n");
scanf("%f", &guess);
printf("How close you want the value to be ?\n");
scanf("%f", &accuracy);
while (fabs(functional_value) <= accuracy && derivative != 0)
{
functional_value = a*pow(guess,3) + b*pow(guess,2) + c*(guess) + d ;
// 3ax^2 + 2bx + c
derivative = 3*a* pow(guess,2) + 2*b*(guess) + c ;
guess -= ((functional_value)/(derivative)) ;
}
printf("A root of the equation is approximately equal to %f", guess);
return 0;
}
我是编程新手,大学时刚学C。我想制作一个程序,使用牛顿法计算立方多项式的根。所以我写了上面的代码。
但是当我运行它时,循环似乎无限地运行。我什至尝试将输入作为 0 1 -2 1(根为 1 的二次方程)但循环仍然是 运行ning.
我没有注意到任何错误。谁能帮我找出我的错误?怎么了?
起初我没有任何精度参数,即人们希望根有多接近,所以我将其添加为双精度。
我看过一些类似的问题,但我不知道他们正在使用的 C 中的所有内容。
编辑#1:感谢评论并指出我愚蠢的语法错误
编辑#2:现在程序 运行s 但它仍然不计算根。我得到以下输出
Please enter values for a,b,c,d respectively :
0 1 -2 1
Please enter your best guess for a root:
0.5
How close you want the value to be ?
0.01
A root of the equation is approximately equal to nan
Process finished with exit code 0
编辑#3:感谢 Eric Postpichilli,现在该程序在使用 fabs() 并将 functional_value 与精度进行比较后确实计算了一个根。但我仍然不明白为什么会出现被零除,我在循环条件中使用了“AND”运算符来尝试防止这种情况发生
启用警告编译(使用 Clang)显示:
- 第17行,
scanf("%f", &accuracy);
是错误的,因为%f
是扫描一个float
,而accuracy
是一个double
.
- 在第 48 行,编译器报告
b*(guess,2)
的 guess
未使用。这是因为缺少预期的 pow
,所以 guess,2
形成了一个 comma-operator 表达式,它忽略了它的左操作数。
- 在第19行,
while (functional_value != accuracy & derivative != 0)
、functional_value
和derivative
没有被初始化就被使用了。
始终在启用警告的情况下进行编译。对于 Clang,从 -Wmost
开始。对于 GCC,从 -Wall
开始。使用 MSVC,从 /W3
.
开始
将警告提升为错误。对于 Clang 和 GCC,使用 -Werror
。对于 MSVC,使用 /WX
.
您可能希望将循环设为 do … while
而不是 while …
,以便 functional_value
在使用前被赋予一个值。但是循环测试还是报错。没有理由期望 functional_value
会完全等于 accuracy
。您想要测试 functional_value
是否至少与 accuracy
一样接近,例如 fabs(functional_value) <= accuracy
.
另外,在循环测试中测试derivative != 0
时,为时已晚,因为它已经在(functional_value)/derivative
中使用过,因此将执行除以零。
#include <stdio.h>
#include <math.h>
int main()
{
// ax^3 + bx^2 + cx + d = 0
float a,b,c,d,guess,derivative;
double functional_value, accuracy;
printf("Please enter values for a,b,c,d respectively :\n");
scanf("%f %f %f %f", &a, &b, &c, &d);
printf("Please enter your best guess for a root:\n");
scanf("%f", &guess);
printf("How close you want the value to be ?\n");
scanf("%f", &accuracy);
while (fabs(functional_value) <= accuracy && derivative != 0)
{
functional_value = a*pow(guess,3) + b*pow(guess,2) + c*(guess) + d ;
// 3ax^2 + 2bx + c
derivative = 3*a* pow(guess,2) + 2*b*(guess) + c ;
guess -= ((functional_value)/(derivative)) ;
}
printf("A root of the equation is approximately equal to %f", guess);
return 0;
}
我是编程新手,大学时刚学C。我想制作一个程序,使用牛顿法计算立方多项式的根。所以我写了上面的代码。
但是当我运行它时,循环似乎无限地运行。我什至尝试将输入作为 0 1 -2 1(根为 1 的二次方程)但循环仍然是 运行ning.
我没有注意到任何错误。谁能帮我找出我的错误?怎么了?
起初我没有任何精度参数,即人们希望根有多接近,所以我将其添加为双精度。
我看过一些类似的问题,但我不知道他们正在使用的 C 中的所有内容。
编辑#1:感谢评论并指出我愚蠢的语法错误
编辑#2:现在程序 运行s 但它仍然不计算根。我得到以下输出
Please enter values for a,b,c,d respectively :
0 1 -2 1
Please enter your best guess for a root:
0.5
How close you want the value to be ?
0.01
A root of the equation is approximately equal to nan
Process finished with exit code 0
编辑#3:感谢 Eric Postpichilli,现在该程序在使用 fabs() 并将 functional_value 与精度进行比较后确实计算了一个根。但我仍然不明白为什么会出现被零除,我在循环条件中使用了“AND”运算符来尝试防止这种情况发生
启用警告编译(使用 Clang)显示:
- 第17行,
scanf("%f", &accuracy);
是错误的,因为%f
是扫描一个float
,而accuracy
是一个double
. - 在第 48 行,编译器报告
b*(guess,2)
的guess
未使用。这是因为缺少预期的pow
,所以guess,2
形成了一个 comma-operator 表达式,它忽略了它的左操作数。 - 在第19行,
while (functional_value != accuracy & derivative != 0)
、functional_value
和derivative
没有被初始化就被使用了。
始终在启用警告的情况下进行编译。对于 Clang,从 -Wmost
开始。对于 GCC,从 -Wall
开始。使用 MSVC,从 /W3
.
将警告提升为错误。对于 Clang 和 GCC,使用 -Werror
。对于 MSVC,使用 /WX
.
您可能希望将循环设为 do … while
而不是 while …
,以便 functional_value
在使用前被赋予一个值。但是循环测试还是报错。没有理由期望 functional_value
会完全等于 accuracy
。您想要测试 functional_value
是否至少与 accuracy
一样接近,例如 fabs(functional_value) <= accuracy
.
另外,在循环测试中测试derivative != 0
时,为时已晚,因为它已经在(functional_value)/derivative
中使用过,因此将执行除以零。