使用Matlab实现:弦截法、二分法、CG法,求零点、解方程

使用Matlab实现:弦截法、二分法、CG法,求零点、解方程

弦截法

例题

x e x − 1 = 0 xe^x - 1 = 0 xex1=0 的根,取初值 x 0 = 0.5 , x 1 = 0.6 。 x_0 = 0.5, x_1 = 0.6。 x0=0.5,x1=0.6

实现

其数学迭代公式为:
x k + 1 = x k − f ( x k ) f ( x k ) − f ( x k − 1 ) ⋅ ( x k − x k − 1 ) x_{k + 1} = x_k - \frac{f(x_k)} {f(x_k) - f(x_{k - 1})} \cdot (x_k - x_{k - 1}) xk+1=xkf(xk)f(xk1)f(xk)(xkxk1)

使用Matlab实现:

f = inline('x * e^x - 1');
x = 0;
xx = 0.5;
xxx = 0.6;
i=0;
while abs(xx-xxx) >= 1e-5
	x = xx;
	xx = xxx;
	xxx = xx - f(xx) / (f(xx) - f(x)) * (xx - x);
	i = i + 1;
end

经过迭代4次,得到 x 5 = 0.56714 x_5 = 0.56714 x5=0.56714
如果需要看到更多小数位数,可以使用:

format long g

二分法

例题

用二分法求方程 2 e − x − s i n x = 0 2e^{-x} - sinx = 0 2exsinx=0 在区间 [ 0 , 1 ] [0, 1] [0,1] 内的根,要求 ∣ x k − x ∗ ∣ &lt; 1 2 × 1 0 − 5 | x_k - x^* | &lt; \frac12 \times 10^{-5} xkx<21×105

实现

首先通过求端点值,求导,确定左边函数在 [ 0 , 1 ] [0, 1] [0,1] 有解,且是单根区间。
c = 0 , d = 1 c = 0, d = 1 c=0,d=1 ,将 [ c , d ] [c, d] [c,d] 对分,设对分点为 x 0 = 1 2 ( c + d ) x_0 = \frac12 (c + d) x0=21(c+d) ,计算 f ( x 0 ) f(x_0) f(x0) ,如果 f ( x 0 ) f(x_0) f(x0) f ( c ) f(c) f(c) 同号,……
d n − c n = 1 2 n ( d − c ) d_n - c_n = \frac1{2^n} (d - c) dncn=2n1(dc) ,只要n足够大,有根区间长度就会足够小,当长度达到精度要求时,取 x n = 1 2 ( c n + d n ) x_n = \frac12 (c_n + d_n) xn=21(cn+dn) 作为方程的根的近似值。

使用Matlab实现:

f = inline('2 * e^(-x) - sin(x)');
c = 0;
d = 1;
x = 1/2 * (c + d);
i = 0;
while d - c >= 1e-5/2
    x = 1/2 * (c + d);
    i ++;
    if f(x) > 0
        c = x;
    elseif f(x) < 0
        d = x;
    else
        break;
    end;
end;

经过18次迭代, c = x 17 c = x_{17} c=x17 时, d − c &lt; 1 2 × 1 0 − 5 d - c &lt; \frac12 \times 10^{-5} dc<21×105 ,得到原方程的解为: x ∗ = 1 2 ( c 18 + d 18 ) = 0.92103 x^* = \frac12 (c_{18} + d_{18}) = 0.92103 x=21(c18+d18)=0.92103

CG法

例题

x 0 = ( 0 , 0 ) T , 用 C G 法 求 解 : x_0 = (0, 0)^T,用CG法求解: x0=(0,0)TCG
[ 6 3 3 2 ] ⋅ [ x 1 x 2 ] = [ 0 − 1 ] \left[\begin{array}{cc} 6 &amp; 3\\ 3 &amp; 2\\ \end{array}\right] \cdot \left[\begin{array}{c} x_1\\ x_2\\ \end{array}\right] = \left[\begin{array}{c} 0\\ -1\\ \end{array}\right] [6332][x1x2]=[01]

实现

方程组化为: A ⋅ x = b A \cdot x = b Ax=b

x 0 = ( 0 , 0 ) T , r 0 = b − A x 0 = ( 0 , − 1 ) T , p 0 = r 0 x_0 = (0, 0)^T,r_0 = b - Ax_0 = (0, -1)^T,p_0 = r_0 x0=(0,0)Tr0=bAx0=(0,1)Tp0=r0

α 0 = ( r 0 , r 0 ) ( p 0 , A p 0 ) = 1 2 \alpha_0 = \frac{(r_0, r_0)}{(p_0, Ap_0)} = \frac12 α0=(p0,Ap0)(r0,r0)=21

x 1 = x 0 + α 0 ⋅ p 0 = ( 0 , − 1 2 ) T x_1 = x_0 + \alpha_0 \cdot p_0 = (0, -\frac12)^T x1=x0+α0p0=(0,21)T

r 1 = r 0 − α 0 ⋅ A ⋅ p 0 = ( 3 2 , 0 ) T r_1 = r_0 - \alpha_0 \cdot A \cdot p_0 = (\frac32, 0)^T r1=r0α0Ap0=(23,0)T

β 0 = ( r 1 , r 1 ) ( r 0 , r 0 ) = 9 4 \beta_0 = \frac{(r_1, r_1)}{(r_0, r_0)} = \frac94 β0=(r0,r0)(r1,r1)=49

p 1 = r 1 + β ⋅ p 0 = ( 3 2 , − 9 4 ) T p_1 = r_1 + \beta \cdot p_0 = (\frac32, -\frac94)^T p1=r1+βp0=(23,49)T

α 1 = ( r 1 , r 1 ) ( p 1 , A p 1 ) = 2 3 \alpha_1 = \frac{(r_1, r_1)}{(p_1, Ap_1)} = \frac23 α1=(p1,Ap1)(r1,r1)=32

x 2 = x 1 + α 1 ⋅ p 1 = ( 1 , − 2 ) T x_2 = x_1 + \alpha_1 \cdot p_1 = (1, -2)^T x2=x1+α1p1=(1,2)T

r 2 = r 1 − α 1 ⋅ A ⋅ p 1 = ( 0 , 0 ) T r_2 = r_1 - \alpha_1 \cdot A \cdot p_1 = (0, 0)^T r2=r1α1Ap1=(0,0)T

r k = 0 或 ( p k , A p k ) = 0 r_k = 0 或 (p_k, Ap_k) = 0 rk=0(pk,Apk)=0 时,计算终止,有 x k = x ∗ x_k = x^* xk=x


使用Matlab实现:

x = [0;0];
A = [6,3;3,2];
b = [0;-1];
r = b - A * x;
p = r;
i = 0;
while !all(r == [0;0]) && !all(dot(p, A * p) == [0;0])
    alpha = dot(r, r) / dot(p, A * p);
    xx = x + alpha * p;
    rr = r - alpha * A * p;
    beta = dot(rr, rr) / dot(r, r);
    pp = rr + beta * p;
    i ++;
    
    r = rr;
    x = xx;
    p = pp;
end;
  • 22
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值