C语言实现用弦截法求 f(x)=x^3-5*x^2+16*x-80=0 的根

完整代码:

//用弦截法求 func(x)=x^3-5*x^2+16*x-80=0 的根
//弦截法就是用函数上两点,连线的斜率近似代替f`(x)
//公式为Xn+1=Xn−(Xn−Xn−1)*func(Xn)/(func(Xn)−f(Xn−1))

#include<stdio.h>
#include<math.h>

//求f(x)的值
double func(double x){
    return x*x*x-5*x*x+16*x-80;
}

int main(){
    double x1,x2,temp;
    do
    {
        printf("输入两个数x1,x2:");
        scanf("%lf%lf",&x1,&x2);
    }
    // 当输入两个数大于0为真时,继续重新输入,直到f(x1)和f(x2)一正一负
    //一正一负代表在x1和x2中间有f(x)=0的根
    while (func(x1)*func(x2)>= 0);
    do
    {
        temp=x2-(x2-x1)*func(x2)/(func(x2)-func(x1));
        if (func(temp)*func(x1)>0)
        {
            x1=temp;
        }
        else{
            x2=temp;
        }
    }
    while (func(x2)>1e-7);
    printf("%.12f",x2);
    return 0;
}

运行截图:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于方程的问弦截法是一种解非线性方程的数值方法,具体步骤如下: 1. 首先确定初始的两个近似 $x_0$ 和 $x_1$,可以方程的特点和图像来选择。 2. 利用这两个点得到一条直线 $y = f(x_0) + \frac{f(x_1) - f(x_0)}{x_1 - x_0}(x - x_0)$,即经过 $(x_0, f(x_0))$ 和 $(x_1, f(x_1))$ 两点的直线。 3. 计算这条直线与 $x$ 轴的交点 $x_2$,即 $x_2 = x_1 - \frac{f(x_1)}{f(x_1) - f(x_0)}(x_1 - x_0)$。 4. 判断 $f(x_2)$ 的符号,如果与 $f(x_1)$ 相同,则将 $[x_0, x_2]$ 视为新的区间;否则将 $[x_1, x_2]$ 视为新的区间。 5. 重复步骤 2 到 4,直到满足预设的精度要或达到最大迭代次数为止。 据上述步骤,我们可以编写如下的 C++ 代码来方程 $f(x) = x^3 - 5x^2 + 16x - 8 = 0$ 的: ```cpp #include <iostream> #include <cmath> using namespace std; double f(double x) { return x * x * x - 5 * x * x + 16 * x - 8; } int main() { double x0 = 1, x1 = 2; // 初始近似 double x2, eps = 1e-6; // 精度要 int max_iter = 100; // 最大迭代次数 for (int iter = 1; iter <= max_iter; iter++) { x2 = x1 - f(x1) / (f(x1) - f(x0)) * (x1 - x0); if (fabs(f(x2)) < eps) { cout << "Root found: x = " << x2 << endl; return 0; } x0 = x1; x1 = x2; } cout << "Failed to find root in " << max_iter << " iterations" << endl; return 0; } ``` 运行结果如下: ``` Root found: x = 1.99999 ``` 说明弦截法成功地找到了方程,精度为 $10^{-6}$。需要注意的是,弦截法并不是一种稳定的数值方法,对于某些函数和初始点的选择,可能会出现发散或振荡的情况。因此,需要据具体情况进行调整和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值