zoukankan      html  css  js  c++  java
  • 数值分析/解方程

    第一章 解方程

    对分法

    根隔离法

    解方程的第一步是证明根存在,然后通过缩小范围来找到它

    定义

    如果 (f(r)=0) ,那么函数 (f(x))(x=r) 处有一个根。

    定理

    (f) 是区间 $ [a,b]$ 上的连续函数,满足 $f(a)f(b)<0 $ ,那么 $f $ 在 (a)(b) 之间有一个根。

    由上述定理我们可得到算法:

    对分法:

    给定区间[a,b],求出一个近似根
    while (b-a)/2 < TOL //TOL是精度
    	c=(a+b)/2
    	if f(c)=0, stop and end
    	if f(a)f(b)<0
    		b=c
    	else
    		a=c
    	end
    end
    	
    

    算法精度和速度

    在区间 ([a,b]) 中进行 (n) 次对分,区间 $ [a_n,b_n]$ 的长度是 ((b-a)/2^n) ,选取中点 (x_c=(a_n+b_n)/2) 作为对解 $r $ 的最好估计,它的真解在半个区间内。

    [解的误差:epsilon=|x_c-r|<frac{b-a}{2^{n+1}}\ 计算函数值的次数:count = n+2 ]

    定义

    如果误差小于 (0.5 imes 10^{-p}) ,那么解精确到 (p) 位小数

    不动点迭代

    函数的不动点

    定义

    如果 (g(r)=r) ,则实数 $r $ 是函数 (g) 的一个不动点

    不动点迭代

    [不动点迭代: x_0=初始估计值\ x_{i+1}=g(x_i), quad i=0,1,2,3... ]

    不动点迭代的几何原理

    (x_{i+1}=g(x_i)) 可得FPI,用曲线$ y=g(x)$ 和 (y=x) 的交点来表示它。FPI的每一步都可以通过画出两条线段来作示意图:

    (1)垂直方向交于曲线

    **(2)水平方向交于对角线 (y=x) **。

    由此画出的不动点迭代的几何图形成为蛛网图

    1551922663451

    不动点迭代的线性收敛性

    定义

    (e_i) 表示迭代法在第 (i) 步的误差,如果:

    [lim_{i o infty}frac{e_{i+1}}{e_i} = S<1,quad e_i = |r-x_i|\ ]

    则说这种方式满足速度是 (S)线性收敛

    定理

    假设 (g) 是连续可微函数,满足 (g(r)=r)(S=|g'(r)|<1),那么对充分接近 (r) 的初始估计,不动点迭代以速度 (S) 线性地收敛于不动点 (r)

    由此可得:在根 (r) 附近,FPI相当于 (e_{i+1}approx Se_i,S=|g'(r)|)

    停止准则

    FPI 收敛到给定的偏差之内所需要的步数很少可以实现预测,我们必须做终止算法是决定,这个就叫停止准则

    容限精度TOL

    绝对误差停止准则:

    [|x_{i+1} - x_i| < TOL ]

    相对误差停止准则:

    [frac{|x_{i+1}-x_i}{|x_{i+1}|} < TOL ]

    混合停止准则:

    [frac{|x_{i+1}-x_i}{max( heta, |x_{i+1}|)}) < TOL ]

    好的FPI代码为了防止收敛失败,对最大迭代步数做出了限制,因此停止准则相当重要。

    对分法保证线性收敛,不动点迭代仅仅是局部收敛,而当它收敛时它是线性收敛,这两种方法要求每一步计算一次函数值,对分法每进行一步,不确定性减少一半,而FPI每进行一步,不确定性近似减少 (S = |g'(r)|) 。因此,不动点迭代可能比对分法要快,当它处于 (S = |g'(r)| > 0.5) 的时候时。

    精度的界限

    数值计算目标之一就是在指定精度下计算出答案,当在double类型下计算很可能导致计算精度达不到要求。这时就会损失一些有效数字。

    前向误差和后向误差

    定义

    (f) 是一个函数,(r) 是一个根,它满足 (f(r)=0) ,假设 (x_c) 是 $r $ 的近似值,对于求根问题,近似值 (x_c) 的后向误差是 ( |f(x_c)-f(r)|=|f(x_c)|) ,而前向误差是 (|r-x_c|)

    当函数的图形在靠近根处比较平坦时,近似解附近的前行误差和后向误差之间存在巨大的差异,垂直方向测量得到的后向误差经常比水平方向的前向误差小得多。

    求零点的病态性通常表现在在零点附近的函数导数的绝对值过大或过小,而导致算法的终止出现问题。

    可通过二者比例来衡量自己的误差

    误差放大因子:

    [delta =frac{|r-x_c|}{|f(x_c)-f(r)|} ]

    如果 (delta) 的值过大或者过小,说明二者误差较大。即近似根附近的斜率过大或者过小。

    定义

    (r) 是可微函数 (f) 的一个跟,即 (f(r)=0) ,那么如果 (f(r)=f'(r)=f''(r)=...=f^{(m-1)}(r)=0) ,但 (f^{(m-1)}(r) e 0) ,就称 (f) 在r处有 (m) 重根,(m=1) 则称为单根

    求根的灵敏度

    方程的小的浮点误差转化成根的大误差,则称该问题是灵敏的。

    推导

    建立一个扰动函数来预测当方程改变时根的变化多大

    问题:求 (f(x)=0) 的根 (r) 使得 (f(r) =0)

    扰动:对输入添加小变化 (varepsilon g(x))

    解:

    (Delta r) 是相应的根的改变,所以:

    $ f(r+Delta r) + varepsilon g(r+Delta r) = 0$

    把f和g展开成一次泰勒级数:

    $f(r)+f'(r)Delta r + varepsilon (g(r) +g'(r)Delta r) + O((Delta r)^2) $

    因为 (varepsilon)(Delta r) 很小,所以有:

    (Delta(r)(f'(r)+varepsilon g'(r) )= -f(r) - varepsilon g(r) = -varepsilon g(r))

    也就是:

    [Delta r approx -frac{varepsilon g(r)}{f'(r)+varepsilon g'(r)} approx -varepsilon frac{g(r)}{f'(r)} ]

    定义

    根的灵敏度公式:

    假设 (r)(f(x)) 的单根而且 (r+Delta r)(f(x)+varepsilon g(x)) 的根,如果 (varepsilon ll f'(r)),那么

    [Delta r approx -frac{varepsilon g(r)}{f'(r)} ]

    例题

    估计 (P(x)=(x-1)(x-2)(x-3)(x-4)(x-5)(x-6)-10^{-6}x^7) 的最大根

    解:

    (P(x)=(x-1)(x-2)(x-3)(x-4)(x-5)(x-6), varepsilon = -10^{-6}以及 g(x)= x^7)

    如果没有 (varepsilon g(x)) 这一项,那么最大根是 (r=6),当加上这一项后,根的变化有多大?

    有灵敏度公式得:

    [Delta r approx -frac{6^7varepsilon}{5!}=-2332.8varepsilon ]

    由此可见 (f(x)) 在相对较小的输入误差 (varepsilon) 对输出根的影响被放大了 (2000) 多倍,由此可以估计 (P(x)) 的最大根是 (r+Delta r = 6-2332.8varepsilon = 6.0023328)(P(x)) 用matlab计算出准确值是:(6.0023268)

    注:

    该例题可以用来简化计算方程,估计根,应该熟记。

    (P(x)) 拆开成一大一小两个函数 (P(x)= f(x)+g(x)) ,然后求出 (Delta r) 然后带入 (x = r + Delta r) 即可求出 (P(x)) 的根。

    条件数

    求根对于特殊的输入改变的灵敏度,问题的灵敏度可能大小不一。问题的条件数定义为所有的输入改变或者至少是所有指定类型的改变情况下最大的误差放大。条件数大的问题称为病态的。条件数接近1的称为良态的。

    (Newton)

    推导

    (f(x) =0) 的根,给定初始估计值 (x_0)

    [y-f(x_0) = f'(x_0)(x-x_0)\ f'(x_0)(x-x_0)=0-f(x_0)\ x-x_0=-frac{f(x_0)}{f'(x_0)}\ x = x_0-frac{x_0}{f'(x_0)} ]

    (Newton)

    (e_i) 是表示一种迭代方法在第 (i) 步后的误差,如果

    [M = lim_{i o infty} frac{e_{i+1}}{e_i^2}<infty ]

    那么这种迭代是二次收敛的。

    (Newton)的二次收敛性

    定义

    (e_i) 是表示一种迭代方法在第 (i) 步后的误差,如果

    [M = lim_{i o infty} frac{e_{i+1}}{e_i^2}<infty ]

    那么这种迭代是二次收敛的。

    定理

    (f) 是二次连续可微函数,并且 (f(r)=0) ,如果 $f'(r) e0 (,那么)Newton$法局部而且二次收敛于 (r)。第 (i) 步误差满足

    [lim_{i oinfty}frac{e_{i+1}}{e^2_i} = M, qquad M=|frac{f''(r)}{2f'(r)}| ]

    (Newton)的线性收敛性

    定理

    设在 ([a,b])((m+1)) 次连续可微函数 (f)(r) 处有 $ m$ 重根,那么 (Newton) 法局部收敛到 (r) ,而且第 (i) 步的误差(e_i) 满足:

    [lim_{i oinfty}frac{e_{i+1}}{e_i}=S,qquad S = frac{m-1}{m} ]

    定理

    如果函数 (f) 在区间 ([a,b])((m+1)) 次连续可微,且含有重数 (m>1)的根 (r),那么修正 (Newton)

    [x_{i+1} = x_i - mfrac{f(x_i)}{f'(x_i)} ]

    局部且二次收敛于 (r)

    注意

    和FPI一样,Newton法也可能不收敛于根。

    不用导数求根

    习题解答

  • 相关阅读:
    ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
    ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
    Asp.Net Core 单元测试正确姿势
    如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
    Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
    使用VS Code 开发.NET CORE 程序指南
    .NetCore下ES查询驱动 PlainElastic .Net 升级官方驱动 Elasticsearch .Net
    重新认识 async/await 语法糖
    EF添加
    EF修改部分字段
  • 原文地址:https://www.cnblogs.com/niubidexiebiao/p/10499915.html
Copyright © 2011-2022 走看看