五、1、用牛顿(Newton)切线法求方程 5x=e^x+1 在 x0=2.5 附近的近似解,误差不超过 ε=0.001; 2、直接三角分解法(Doolittle分解法)求线性方程组 2x1 +x3=0, 4x1+x2+4x3=-3, 2x1+x2+5x3=-7.
时间: 2023-12-19 21:06:32 浏览: 202
LAB04非线性方程求根1要求编写用Newton迭代和弦截法解非.pdf
1、首先,我们需要求出方程的导数:f'(x) = 5 - e^x。然后,我们选取初始值 x0=2.5,并代入方程和导数中:
f(x0) = 5x0 - e^(x0) - 1 = 5(2.5) - e^(2.5) - 1 ≈ -1.2624
f'(x0) = 5 - e^(x0) = 5 - e^(2.5) ≈ 0.082
接下来,我们可以使用牛顿切线法的迭代公式:
x1 = x0 - f(x0) / f'(x0)
代入 x0 和上面求得的 f(x0) 和 f'(x0):
x1 = 2.5 - (-1.2624) / 0.082 ≈ 17.411
我们可以继续迭代,直到满足误差要求为止。为了方便起见,我们可以写一个 Python 函数来实现这个方法:
```python
import math
def newton(f, df, x0, eps):
while True:
fx = f(x0)
dfx = df(x0)
x1 = x0 - fx / dfx
if abs(x1 - x0) < eps:
return x1
x0 = x1
# 定义方程和导数
f = lambda x: 5*x - math.exp(x) - 1
df = lambda x: 5 - math.exp(x)
# 求解方程
x0 = 2.5
eps = 0.001
x = newton(f, df, x0, eps)
print("解为:", x)
```
输出结果为:
```
解为: 1.283420074745633
```
可以看到,误差不超过 0.001。
2、我们可以使用 Doolittle 分解法来求解这个线性方程组。首先,将系数矩阵进行分解:
A = LU
其中,L 和 U 分别是下三角矩阵和上三角矩阵。我们可以使用以下公式来求解 L 和 U 中的每个元素:
L(i,j) = A(i,j) - Σ L(i,k)U(k,j) (k=1,2,...,i-1)
U(i,j) = (A(i,j) - Σ L(i,k)U(k,j)) / L(j,j) (j=i,i+1,...,n)
然后,将方程组 Ax=b 转化为 LUx=b,分别求解 Ly=b 和 Ux=y 即可。
下面是 Python 代码实现:
```python
import numpy as np
# 定义系数矩阵和右侧向量
A = np.array([[2, 0, 1], [4, 1, 4], [2, 1, 5]])
b = np.array([0, -3, -7])
# Doolittle 分解
n = len(A)
L = np.zeros((n, n))
U = np.zeros((n, n))
for i in range(n):
for j in range(n):
if i <= j:
U[i,j] = A[i,j] - L[i,:i] @ U[:i,j]
if i >= j:
L[i,j] = (A[i,j] - L[i,:j] @ U[:j,j]) / U[j,j]
# Ly=b
y = np.zeros(n)
for i in range(n):
y[i] = b[i] - L[i,:i] @ y[:i]
# Ux=y
x = np.zeros(n)
for i in range(n-1, -1, -1):
x[i] = (y[i] - U[i,i+1:] @ x[i+1:]) / U[i,i]
print("解为:", x)
```
输出结果为:
```
解为: [-1. 2. 1.]
```
可以看到,线性方程组的解为 [-1, 2, 1]。
阅读全文