通过1-2个具体算例实现非线性方程求根体会根的搜索即找到隔根区间、设计算法实现问题求解的完整过程。
算例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
``
原文地址: https://www.cveoy.top/t/topic/flME 著作权归作者所有。请勿转载和采集!