zoukankan      html  css  js  c++  java
  • 解方程——对分法

    对分法的理论依据是:设f是区间[a,b]上得连续函数,满足f(a)f(b)<0,那么f在a和b之间有一个根r,使得f(r) = 0

    算法分析:

    1.首先确定r在(a,b)区间内

    2.令c0 = (a0 + b0)/2

    if f(c0)f(a0) < 0

    b1 = c0; a1 = a0

    else

    a1 = c0; b1 = b0

    3.以此类推 

    matlab代码实现:

    %代码运行前先要建立一个内联函数,比如f=inline('x^3 + x - 1')
    function xc = bisect(f,a,b,tol)
    if sign(f(a))*sign(f(b)) >= 0
        error('f(a)f(b)<0 not satisfied!')
    end
    
    fa = f(a);
    fb = f(b);
    k = 0;
    while (b - a)/2 > tol %这里的tol是指求根时要求的精度
        c = (a + b)/2;
        fc = f(c);
        if fc ==0
            break
        end
        if sign(fc)*sign(fa) < 0
            b = c;
            fb = fc;
        else
            a = c;
            fa = fc;
        end
    end
    
    xc = (a + b)/2

    算法的精度:

    设[a0,b0]为初始区间,

    第一次对分后变为[a1,b1],长度变为(b0 - a0)/2

    第一次对分后变为[a2,b2],长度变为(b0 - a0)/2^2

    ... ...

    第n次对分后变为[an,bn],长度变为(b0 - a0)/2^n

    我们取xc = (an + bn)/2 为根的近似,

    则误差为:|xc - r| < (b0 - a0)/2^(n+1)

    我们定义:如果误差小于0.5x10^(-p),那么解精确到P位小数

    这样一来,我们就可以根据所要求的解的精确度来确定需要对分的次数n了。

    例子:在区间[0,1]上求f(x)=cosx - x的根,精确到6位小数

    根据误差公式:(1-0)/2^(n+1) < 0.5*10^(-6)

    可以求得 n >= 19.9

    也就是说至少要对分20次才能达到所要求的精度。

  • 相关阅读:
    Java网络技术-待续
    Java输入输出技术
    Java数据库技术
    Java安全技术
    Java异常、事件、多线程
    网站产品设计
    C#-委派和事件
    Quartz 触发器(SimpleTrigger&CronTrigger )配置说明 & cronExpression表达式 转
    weblogic出现response already committed(转)
    Weblogic二种修改端口的方法(转)
  • 原文地址:https://www.cnblogs.com/bigpo/p/4149215.html
Copyright © 2011-2022 走看看