#include <stdio.h>
#include <math.h>
int main()
{
double a, b, fa, fb, x, fx; // 定义双精度浮点型变量a、b、fa、fb、x、fx
printf("请输入两个数字"); // 提示用户输入两个数字
scanf("%lf%lf", &a, &b); // 从用户输入中读取两个数字,并赋值给a和b
fa = a * a * a - 6 * a - 1; // 计算函数f(a)的值,其中f(x) = x^3 - 6x - 1
fb = b * b * b - 6 * b - 1; // 计算函数f(b)的值,其中f(x) = x^3 - 6x - 1
if (fa * fb < 0) // 如果f(a)和f(b)的乘积小于0,即f(a)和f(b)异号
{
while (fabs(fa - fb) >= 1e-4) // 当f(a)和f(b)的差的绝对值大于等于 1e-4 时循环执行以下操作
{
x = (a + b) / 2; // 取a和b的中点作为新的近似解x
fx = x * x * x - 6 * x - 1; // 计算函数f(x)的值,其中f(x) = x^3 - 6x - 1
if (fx * fa > 0) // 如果f(x)和f(a)的乘积大于0,即f(x)和f(a)同号
{
a = x; // 更新a为新的近似解x
fa = a * a * a - 6 * a - 1; // 计算函数f(a)的值,其中f(x) = x^3 - 6x - 1
}
else
{
b = x; // 更新b为新的近似解x
fb = b * b * b - 6 * b - 1; // 计算函数f(b)的值,其中f(x) = x^3 - 6x - 1
}
printf("%f\n", x); // 输出每次迭代得到的近似解x
}
}
else
{
printf("error"); // 如果f(a)和f(b)的乘积不小于0,输出错误信息
}
}
是不是发现好像一下子看不懂,早猜到了,下面让我来具体讲解一下:
本文使用了“二分法”来解方程,流程为:
对于用户的输入:不能随便输入,首先根据方程本身,判断出能让方程结果小于0和大于0的两个变量a和b(用肉眼或直觉来判断,或者稍微带几个值进去)。一般情况下:令a=0,可以让方程结果y小于0,令b=1,令x=0,可以让方程结果y大于0。
// 这样做的目的是:让近似解出现在a和b的中间,方便“二分法”的计算。
对于结果的输出:
1. 通过用户输入获取两个数字a和b,然后计算函数f(a)和f(b)的值。如果f(a)和f(b)异号(乘积小于0),则进入循环。
2. 在每一次循环中计算a和b的中点x,并计算函数f(x)的值。
3. 根据f(x)和f(a)的乘积的符号,更新a或b的值为x。如果f(x)小于0,则保留f(x)和f(b),并用x的值代替a的值;如果f(x)大于0,则保留f(a)和f(x),并用x的值代替b的值。并更新对应的函数值fa或fb。(其实就是保证近似解x的函数值,它的左边函数值要小于0,右边函数值要大于0)
4. 循环直到f(a)和f(b)的差的绝对值小于1e-4,即找到了方程的近似解。(总不能一直循环下去吧,找到个近似解就行了,真实解估计要循环一辈子了)