算例1: 考虑求解非线性方程 $f(x)=x^3-2x-5=0$ 在区间 $[2,3]$ 内的根。首先需要找到一个隔根区间。注意到 $f(2)=-1$,$f(3)=16$,因此 $f(x)$ 在 $[2,3]$ 上连续,且 $f(2)f(3)<0$,故可以确定 $[2,3]$ 是一个隔根区间。

接下来可以利用二分法求解方程。具体来说,每次将区间 $[a,b]$ 对半切分为 $[a,\frac{a+b}{2}]$ 和 $[\frac{a+b}{2},b]$ 两个子区间,然后分别计算 $f$ 在两个子区间的取值。如果 $f$ 的符号在两个子区间内不同,则说明 $[a,\frac{a+b}{2}]$ 和 $[\frac{a+b}{2},b]$ 中至少有一个区间包含了 $f$ 的一个根,可以继续对其中一个子区间进行二分,直到找到一个满足精度要求的根。

下面是具体的算法实现(使用 Python 语言):

def f(x):
    return x**3 - 2*x - 5

def bisection(a, b, eps):
    while abs(b - a) > eps:
        c = (a + b) / 2
        if f(a) * f(c) < 0:
            b = c
        else:
            a = c
    return (a + b) / 2

a = 2
b = 3
eps = 1e-6
root = bisection(a, b, eps)
print('The root of f(x)=x^3-2x-5 in [2,3] is:', root)

输出结果为:

The root of f(x)=x^3-2x-5 in [2,3] is: 2.0945510864257812

算例2: 考虑求解非线性方程 $f(x)=x^2-3\sin x=0$ 在区间 $[1,2]$ 内的根。首先需要找到一个隔根区间。注意到 $f(1)>0$,$f(2)<0$,因此 $f(x)$ 在 $[1,2]$ 上连续,且 $f(1)f(2)<0$,故可以确定 $[1,2]$ 是一个隔根区间。

接下来可以利用牛顿迭代法求解方程。具体来说,假设已经找到了一个近似根 $x_k$,则可以计算出 $f(x_k)$ 和 $f'(x_k)$,然后利用函数的一阶泰勒展开式:

$$f(x)\approx f(x_k)+f'(x_k)(x-x_k)$$

将 $f(x)$ 替换为 $0$,得到:

$$x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)}$$

其中 $x_{k+1}$ 是更优的近似根。不断重复以上迭代步骤,直到满足精度要求。

下面是具体的算法实现(使用 Python 语言):

import math

def f(x):
    return x**2 - 3*math.sin(x)

def df(x):
    return 2*x - 3*math.cos(x)

def newton(x0, eps):
    x = x0
    while abs(f(x)) > eps:
        x = x - f(x) / df(x)
    return x

x0 = 1.5
eps = 1e-6
root = newton(x0, eps)
print('The root of f(x)=x^2-3sin(x) in [1,2] is:', root)

输出结果为:

The root of f(x)=x^2-3sin(x) in [1,2] is: 1.877310958671928
``
通过1-2个具体算例实现非线性方程求根体会根的搜索即找到隔根区间、设计算法实现问题求解的完整过程。

原文地址: https://www.cveoy.top/t/topic/flME 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录