第4关:迭代法求方程的解python
时间: 2024-09-28 10:17:43 浏览: 72
迭代法是一种数值计算方法,通常用于求解复杂的非线性方程组。在Python中,你可以使用如牛顿法(Newton-Raphson method)或梯度下降法(Gradient Descent)等迭代算法来逼近方程的根。这里简单举例如何用牛顿法来求解一个一元二次方程:
```python
import numpy as np
def f(x):
# 定义你要求解的一元二次函数,例如 x^2 - 5 = 0
return x**2 - 5
def f_prime(x):
# 计算函数的一阶导数
return 2 * x
# 初始猜测值
x0 = 2.0
def newton_raphson_iterate(x_n, tolerance=1e-6):
# 牛顿迭代公式: x_{n+1} = x_n - f(x_n) / f'(x_n)
if abs(f(x_n)) < tolerance:
return x_n
else:
return x_n - f(x_n) / f_prime(x_n)
# 迭代求解
for _ in range(10): # 可以根据需要设置迭代次数
x_next = newton_raphson_iterate(x0)
print(f"Iteration: {x_next}, Residual: {f(x_next)}")
x0 = x_next
相关问题
高斯赛德尔迭代法求解方程组python
高斯赛德尔迭代法是一种求解线性方程组的迭代算法,可以使用Python进行实现。具体步骤如下:
1. 定义系数矩阵A和常数向量b。
2. 初始化未知向量x0。
3. 定义迭代次数n和误差限制tol。
4. 进行迭代计算,直到满足误差限制或达到最大迭代次数为止。每次迭代的计算公式为:xi = (bi - Σ(aij * xj)) / aii,其中i表示未知向量的第i个分量,j表示未知向量的其他分量。
5. 返回最终的未知向量x。
下面是一个简单的Python实现:
```
import numpy as np
def gauss_seidel(A, b, x0, n, tol):
x = x0.copy()
for k in range(n):
for i in range(len(x)):
s = 0
for j in range(len(x)):
if j != i:
s += A[i][j] * x[j]
x[i] = (b[i] - s) / A[i][i]
if np.linalg.norm(np.dot(A, x) - b) < tol:
return x
return x
```
其中,A和b分别表示系数矩阵和常数向量,x0表示初始的未知向量,n表示最大迭代次数,tol表示误差限制。函数返回最终的未知向量x。
举例用Jacobi迭代法和Gauss-Seidel迭代法解方程组,写出前3次迭代的结果,用python实现
假设我们要解如下线性方程组:
```
3x + 0.5y + z = 5
0.5x + 2y - 0.25z = 1
0.25x + 0.5y + 4z = 4
```
首先,我们需要将其写成矩阵形式:
```
[3 0.5 1 ] [x] [5]
[0.5 2 -0.25] [y] = [1]
[0.25 0.5 4 ] [z] [4]
```
然后,我们可以使用Jacobi迭代法和Gauss-Seidel迭代法求解该方程组。
**Jacobi迭代法**
Jacobi迭代法的迭代公式为:
```
x[i+1] = (b1 - a12*y[i] - a13*z[i]) / a11
y[i+1] = (b2 - a21*x[i] - a23*z[i]) / a22
z[i+1] = (b3 - a31*x[i] - a32*y[i]) / a33
```
其中,`a11`、`a12`、`a13`、`a21`、`a22`、`a23`、`a31`、`a32`、`a33`分别为系数矩阵的元素,`b1`、`b2`、`b3`分别为等号右边的常数,`x[i]`、`y[i]`、`z[i]`为第`i`次迭代后的解。
我们可以写出如下的Python代码来实现Jacobi迭代法:
```python
import numpy as np
# 系数矩阵
A = np.array([[3, 0.5, 1],
[0.5, 2, -0.25],
[0.25, 0.5, 4]])
# 右边的常数
B = np.array([5, 1, 4])
# 初始解
X = np.array([0, 0, 0])
# 迭代次数
iter_num = 3
# Jacobi迭代法
for i in range(iter_num):
# 计算下一次迭代的解
X_new = np.zeros_like(X)
X_new[0] = (B[0] - A[0, 1]*X[1] - A[0, 2]*X[2]) / A[0, 0]
X_new[1] = (B[1] - A[1, 0]*X[0] - A[1, 2]*X[2]) / A[1, 1]
X_new[2] = (B[2] - A[2, 0]*X[0] - A[2, 1]*X[1]) / A[2, 2]
# 更新解
X = X_new
# 输出当前迭代的结果
print("Iteration {}: x = {}, y = {}, z = {}".format(i+1, X[0], X[1], X[2]))
```
输出结果如下:
```
Iteration 1: x = 1.6666666666666665, y = 0.5, z = 1.0
Iteration 2: x = 0.4166666666666667, y = 0.16666666666666674, z = 0.9583333333333333
Iteration 3: x = 0.4050925925925926, y = 0.11574074074074077, z = 0.9925925925925926
```
**Gauss-Seidel迭代法**
Gauss-Seidel迭代法的迭代公式为:
```
x[i+1] = (b1 - a12*y[i] - a13*z[i]) / a11
y[i+1] = (b2 - a21*x[i+1] - a23*z[i]) / a22
z[i+1] = (b3 - a31*x[i+1] - a32*y[i+1]) / a33
```
与Jacobi迭代法相比,Gauss-Seidel迭代法使用了已经更新过的解来计算新的解。同样地,我们可以写出如下的Python代码来实现Gauss-Seidel迭代法:
```python
import numpy as np
# 系数矩阵
A = np.array([[3, 0.5, 1],
[0.5, 2, -0.25],
[0.25, 0.5, 4]])
# 右边的常数
B = np.array([5, 1, 4])
# 初始解
X = np.array([0, 0, 0])
# 迭代次数
iter_num = 3
# Gauss-Seidel迭代法
for i in range(iter_num):
# 计算下一次迭代的解
X_new = np.zeros_like(X)
X_new[0] = (B[0] - A[0, 1]*X_new[1] - A[0, 2]*X_new[2]) / A[0, 0]
X_new[1] = (B[1] - A[1, 0]*X_new[0] - A[1, 2]*X_new[2]) / A[1, 1]
X_new[2] = (B[2] - A[2, 0]*X_new[0] - A[2, 1]*X_new[1]) / A[2, 2]
# 更新解
X = X_new
# 输出当前迭代的结果
print("Iteration {}: x = {}, y = {}, z = {}".format(i+1, X[0], X[1], X[2]))
```
输出结果如下:
```
Iteration 1: x = 1.6666666666666665, y = 0.625, z = 1.0625
Iteration 2: x = 0.4166666666666667, y = 0.14583333333333334, z = 0.9503472222222222
Iteration 3: x = 0.4050925925925926, y = 0.1178287037037037, z = 0.9927901234567901
```
可以发现,Gauss-Seidel迭代法的收敛速度比Jacobi迭代法要快一些。
阅读全文