数值计算方法 Chapter4. 非线性方程求根

本文介绍了数值计算中解决非线性方程求根的几种方法,包括实根的对分法、迭代法、Newton迭代法和弦截法。对分法通过不断迭代缩小搜索区间找到零点;迭代法通过构造迭代关系求解;Newton迭代法利用泰勒展开近似求解;弦截法则是Newton迭代法的简化版本。每种方法都提供了相应的Python伪代码实现。

0. 问题描述

给定一个复杂方程 f ( x ) = 0 f(x) = 0 f(x)=0,如果直接求解其解析解非常复杂或者难以求解的话,那么可以通过数值求解的方法得到一定精度条件下的数值解。

1. 实根的对分法

对分法使用的条件需要满足:

  1. f ( x ) f(x) f(x)在区间 [ a , b ] [a,b] [a,b]上连续;
  2. f ( a ) ⋅ f ( b ) < 0 f(a) \cdot f(b) < 0 f(a)f(b)<0

那么, f ( x ) f(x) f(x)在区间 [ a , b ] [a,b] [a,b]中必然存在至少一个零点,我们可以使用二分法不断地迭代求解。

给出python伪代码如下:

def bisect_solve(fn, a, b, epsilon=1e-9):
    assert(fn(a) * fn(b) < 0)
    while b - a >= epsilon:
        m = (a + b)/2
        if fn(m) * fn(a) > 0:
            a = m
        elif fn(m) * fn(b) > 0:
            b = m
        else:
            return m
    return (a+b)/2

2. 迭代法

迭代法的思路是说,将方程 f ( x ) = 0 f(x) = 0 f(x)=0 改写为方程 x = φ ( x ) x = \varphi(x) x=φ(x)

此时,我们可以构造迭代关系 x k + 1 = φ ( x k ) x_{k+1} = \varphi(x_k) xk+1=φ(xk),如果数列 x k x_k xk收敛,那么数列 x k x_k xk的极限 l i m k → ∞ x k lim_{k \to \infty} x_k limkxk 即为目标方程的解。

而关于数列的收敛条件的判断,我们有定理:

定理 4.1
φ ( x ) \varphi(x) φ(x)定义在 [ a , b ] [a,b] [a,b]上,且满足:
(1) 当 x ∈ [ a , b ] x \in [a, b] x[a,b]时,有 a ≤ φ ( x ) ≤ b a \leq \varphi(x) \leq b aφ(x)b
(2) φ ( x ) \varphi(x) φ(x) [ a , b ] [a,b] [a,b]上可到,且存在正数 L < 1 L < 1 L<1,使得对于任意 x ∈ [ a , b ] x \in [a, b] x[a,b],有 ∣ φ ′ ( x ) ∣ ≤ L |\varphi'(x)| \leq L φ(x)L
则在 [ a , b ] [a, b] [a,b]上有唯一的点 x ∗ x^* x满足 x ∗ = φ ( x ∗ ) x^* = \varphi(x^*) x=φ(x),称 x ∗ x^* x φ ( x ) \varphi(x) φ(x)的不动点,且迭代格式 x k + 1 = x k x_{k+1} = x_{k} xk+1=xk对任意的初值 x 0 ∈ [ a , b ] x_0 \in [a,b] x0[a,b]均收敛于 φ ( x ) \varphi(x) φ(x)的不动点 x ∗ x^* x,且有误差估计式:
∣ x ∗ − x k ∣ ≤ L k 1 − L ∣ x 1 − x 0 ∣ |x^* - x_k| \leq \frac{L^k}{1-L}|x_1 - x_0| xxk1LLkx1x0

同样的,我们可以给出python伪代码实现如下:

def iter_solve(fn, x, epsilon=1e-9):
    MAX_ITER_TIME = 10**7
    for _ in range(MAX_ITER_TIME):
        y = fn(x)
        if abs(y-x) <= epsilon:
            return y
        x = y
    return x

3. Newton迭代法

Newton迭代法的思路来源于泰勒展开,给出Talyer展开公式如下:

f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ⋅ ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ⋅ ( x − x 0 ) 2 + . . . + f ( n ) ( x 0 ) n ! ⋅ ( x − x 0 ) n + . . . f(x) = f(x_0) + f'(x_0) \cdot (x-x_0) + \frac{f''(x_0)}{2!} \cdot (x-x_0)^2 + ... + \frac{f^{(n)}(x_0)}{n!} \cdot (x-x_0)^n + ... f(x)=f(x0)+f(x0)(xx0)+2!f(x0)(xx0)2+...+n!f(n)(x0)(xx0)n+...

如果视二阶以上的结果为小量,则有:

x ≃ x 0 + f ( x ) − f ( x 0 ) f ′ ( x 0 ) x \simeq x_0 + \frac{f(x) - f(x_0)}{f'(x_0)} xx0+f(x0)f(x)f(x0)

x x x为零点时,有 f ( x ) = 0 f(x) = 0 f(x)=0,因此,我们近似即有:

x ≃ x 0 − f ( x 0 ) f ′ ( x 0 ) x \simeq x_0 - \frac{f(x_0)}{f'(x_0)} xx0f(x0)f(x0)

由此,我们即可给出Newton迭代公式如下:

x k + 1 = x k − f ( x k ) f ′ ( x k ) x_{k+1} = x_k - \frac{f(x_k)}{f'(x_k)} xk+1=xkf(xk)f(xk)

其物理含义是说:

  • 每次在曲线的某一个点上做一条切线,取该切线与x轴的交点作为下一个迭代点。

给出python伪代码如下:

def newton_solve(fn, dfn, x, epsilon=1e-9):
    MAX_ITER_TIME = 10**7
    for _ in range(MAX_ITER_TIME):
        y = x - fn(x)/dfn(x)
        if abs(y-x) <= epsilon:
            return y
        x = y
    return x

4. 弦截法

弦截法其实就是Newton迭代法的一个近似版本,具体来说,就是将导数用弦截公式进行替换。

给出弦截法的迭代公式如下:

x k + 1 = x k − f ( x k ) ⋅ x k − x k − 1 f ( x k ) − f ( x k − 1 ) x_{k+1} = x_k - f(x_k) \cdot \frac{x_k - x_{k-1}}{f(x_k) - f(x_{k-1})} xk+1=xkf(xk)f(xk)f(xk1)xkxk1

同样给出python伪代码如下:

def secant_solve(fn, x1, x0, epsilon=1e-9):
    MAX_ITER_TIME = 10**7
    for _ in range(MAX_ITER_TIME):
        y = x1 - fn(x1) * (x1 - x0) / (fn(x1) - fn(x0))
        if abs(y-x1) <= epsilon:
            return y
        x1, x0 = y, x1
    return x
源码链接: https://pan.quark.cn/s/fa13cd6c6c8d Chrome浏览器作为一款备受青睐的网页浏览器,凭借其出色的稳定性和运行速度获得了广泛认可。 然而出于安全考量,Chrome系统默认不兼容ActiveX插件,因为ActiveX技术主要应用于Internet Explorer,它赋予网页内容与用户本地系统交互的能力,但同时也可能引发潜在的安全隐患。 不过在某些特定工作场景下,比如在企业内部网络环境或需要与老旧应用程序整合时,可能仍需在Chrome中启用ActiveX控件。 为此我们必须掌握在Chrome浏览器下加载和运用ActiveX的方法。 首先需要明确ActiveX的本质。 ActiveX是由微软设计的一种技术框架,旨在开发可在网页环境中运行的控件,这些控件能够完成多种功能,包括视频播放、应用程序组件运行或与硬件设备通信等。 ActiveX控件多以OCX(OLE控件)格式发布。 在Chrome浏览器中启用ActiveX需要采取额外措施,因为该浏览器本身并不支持此项技术。 以下是几种常见的解决方案: 1. **应用Chrome的兼容性设置**:部分Chrome版本提供了" --enable-internal-activex"命令行参数,可通过此参数使浏览器具备加载ActiveX控件的能力。 用户可在启动Chrome时,于快捷方式的目标路径后附加该参数来激活此功能。 例如:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --enable-internal-activex。 2. **安装第三方插件**:市面上存在一些第三方插件,例如"IE Tab"或"ActiveX Con...
标题SpringBoot与微信小程序结合的健康饮食平台研究AI更换标题第1章引言介绍健康饮食平台的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述健康饮食平台在当前社会的重要性及其市场需求。1.2国内外研究现状分析国内外健康饮食平台的发展现状及趋势。1.3研究方法及创新点概述本文采用的研究方法和技术创新点。第2章相关理论总结健康饮食、SpringBoot及微信小程序的相关理论。2.1健康饮食理论介绍健康饮食的基本原则和营养学知识。2.2SpringBoot框架阐述SpringBoot框架的特点、优势及在项目中的应用。2.3微信小程序技术介绍微信小程序的开发技术、特点及其用户群体。第3章健康饮食平台设计详细介绍健康饮食平台的设计方案,包括前端和后端设计。3.1平台架构设计给出平台的整体架构、模块划分及交互流程。3.2数据库设计介绍数据库的设计思路、表结构及数据关系。3.3前后端交互设计阐述前后端数据交互的方式、接口设计及安全性考虑。第4章微信小程序实现介绍微信小程序的具体实现过程,包括页面设计、功能实现等。4.1页面设计与布局给出微信小程序的页面设计思路、布局及交互效果。4.2功能实现与测试详细介绍微信小程序各项功能的实现过程及测试方法4.3用户体验优化阐述如何提升微信小程序的用户体验,包括界面优化、性能优化等。第5章平台测试与优化对健康饮食平台进行测试,并根据测试结果进行优化。5.1测试环境与数据介绍测试环境、测试数据及测试方法。5.2测试结果分析从功能、性能、用户体验等方面对测试结果进行详细分析。5.3平台优化策略根据测试结果提出平台优化策略,包括代码优化、功能改进等。第6章结论与展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括本文的主要研究结论和平台实现效果。6.2展望指出本文研究的不足之处以及未来研究的方向和改进点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值