C语言入门:原来代码也能解方程,而且这么简单!!

C语言入门:原来代码也能解方程,而且这么简单!!

#include

#include

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,即找到了方程的近似解。(总不能一直循环下去吧,找到个近似解就行了,真实解估计要循环一辈子了)

相关推荐

世预赛-C罗中框伊尔马兹破门+失点 葡萄牙3-1土耳其
世界杯韩国墨西哥历史战绩(回顾韩墨之间激动人心的对决,揭秘背后的故事)
马的成语和解释160个
Bet体育365提款验证

马的成语和解释160个

📅 07-26 👁️ 4138