数值分析非线性方程求根(牛顿切线法、割线法)
时间: 2025-01-21 14:23:17 浏览: 59
### 数值分析中的非线性方程求根方法
#### 牛顿迭代法简介
牛顿迭代法是一种用于寻找实数域上连续可微函数零点的有效算法。该方法基于泰勒级数的一阶近似,在每次迭代过程中,使用当前估计位置处的导数值构建一条切线,并取这条直线与横坐标相交之处作为下一次逼近的位置[^4]。
#### 割线法概述
不同于牛顿法依赖于精确计算目标函数的一阶导数,割线法则采用两点之间的斜率代替导数来进行更新操作。这种方法不需要显式地提供或估算梯度信息,而是通过前两次猜测的结果来决定新的试探方向[^1]。
#### 算法实现对比
##### Python 实现牛顿迭代法
```python
def newton_method(f, df, x0, tol=1e-8, max_iter=100):
"""
使用牛顿法求解非线性方程f(x)=0.
参数:
f : 函数对象, 表示待求解的目标函数
df: 函数对象, 计算f'(x), 即f的一阶导数
x0: float, 初始猜测值
tol: 浮点数, 收敛精度阈值,默认为1E-8
max_iter: 整型, 最大允许迭代次数
返回:
tuple(float,int): 近似解及其对应的迭代步数
"""
xn = x0
for n in range(0,max_iter):
fxn = f(xn)
if abs(fxn) < tol:
return xn,n
Dfxn = df(xn)
if Dfxn == 0:
raise ZeroDivisionError('Zero derivative encountered.')
xn -= fxn/Dfxn
print("Warning: Maximum number of iterations reached.")
return None, max_iter
```
##### Python 实现割线法
```python
def secant_method(f, x0, x1, tol=1e-8, max_iter=100):
"""
应用割线法解决单变量非线性方程问题
参数:
f : 可调用的对象, 定义了要找根的函数
x0,x1: 初始化区间端点
tol: 终止条件下的绝对误差界限
max_iter: 允许的最大循环轮次
输出:
如果成功收敛,则返回浮点类型的根;否则发出警告并给出最后一次尝试得到的最佳估值。
"""
a_n = x0; b_n = x1;
fa = f(a_n); fb = f(b_n);
for i in range(max_iter):
m_n = a_n - fa*(b_n-a_n)/(fb-fa)
fm = f(m_n)
err = abs(fm)
if err < tol:
break
elif np.sign(fa)*np.sign(fm)<0 :
b_n,a_n = m_n,b_n
fb,fa=fm,fb
else:
a_n,b_n=m_n,a_n
fa,fb=fm,fa
else:
print("Maximum iteration limit exceeded without convergence.")
return m_n,i+1
```
#### 示例说明
假设有一个简单的二次多项式 \( g(x) = x^2 - 9 \),其真实根显然为 ±3 。下面分别展示如何运用上述两种方法对其进行求解:
对于牛顿法而言,除了定义好原函数外还需要指定它的解析形式的一阶导数表达式 `dg` ,而割线法则只需要输入原始函数即可开始工作。
```python
import numpy as np
g = lambda x: x ** 2 - 9 # 目标函数
dg = lambda x: 2 * x # 导数
root_newton,_ = newton_method(g,dg,-5.)
print(f"Newton's method found root at {root_newton:.6f}")
root_secant,_ = secant_method(g,-5.,-4.)
print(f"Secant method located the root near {root_secant:.6f}")
```
运行这段代码将会输出两个非常接近实际解 (-3 或者 +3) 的数值结果,证明这两种方法都能有效地处理这类简单情况。
阅读全文
相关推荐


















