真爱无限的C++博客

向ACM进军!
posts - 1, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

弦截法求方程的根

Posted on 2009-12-23 22:14 蒲奎民 阅读(1132) 评论(0)  编辑 收藏 引用 所属分类: hhtc-C++
 

弦截法求方程的根是一种解方程得基本方法,在计算机编程中常用。他的思路是这样的:任取两个数,判断这两个数的函数值,如果函数值是同号,换两个数再试,直到两个数x1x2对应的函数值为异号时为止,这时方程的解肯定在这两个数x1x2之间。连接这两点所对应的函数值,连线与x轴的交点为新的x,若f(x)f(x1)同号,则把x当作新的x1,将新的x1x2连接,如此循环……如果f(x)f(x1)异号,则把把x当作新的x2,将x1与新的x2连接,循环……

编程使用弦截法求方程f(x)=x^3-5x^2+16x-80=0的根的近似值(保留4位小数),当fabs(f(x))<0.0001时就停止计算。5.0000

例如输入:

2 6

输出:5.0000

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
#define f(x) (x*x*x-5*x*x+16*x-80)
#define jd 0.000001
#define max 100
double aa;
bool gg(double x0, double x1)
{
    double xk, xk1, xk2;
    xk = x0;
    xk1 = x1;
    for (int i=0; i<max; i++)
    {
        xk2 = xk1-f(xk1)*(xk1-xk)/(f(xk1)-f(xk));
        if (fabs(xk2-xk1) < jd)
        {
            aa = xk1;
            return 1;
        }
        else
        {
            xk = xk1;
            xk1 = xk2;
        }
    }
    return 0;
}
int main()
{
    double x0, x1;
    cin>>x0>>x1;
    if(gg(x0, x1))
    {
        cout<<setprecision(4)<<fixed<<aa<<endl;
    }
    return 0;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理