菜汤今天看了篇可变阶微分方程的论文, 其中涉及到了迭代序列的内容.
一般的, 数学上的迭代序列是无限的, 而编程语言中的迭代都是有限的.
利用 Python 中的 yield 关键字实现非线性方程求根的
无限
序列生成.
例如说, 我们利用迭代法求解函数
g
(
σ
)
=
σ
−
[
1
−
1
2
α
(
a
+
σ
τ
)
]
g(\sigma) = \sigma - [1 - \frac{1}{2} \alpha (a + \sigma \tau)]
g
(
σ
)
=
σ
−
[
1
−
2
1
α
(
a
+
σ
τ
)
]
的零点. 这里不妨取
α
(
t
)
=
2
+
s
i
n
(
t
)
4
\alpha (t) = \frac{2 + sin(t)}{4}
α
(
t
)
=
4
2
+
s
i
n
(
t
)
则计算函数
g
(
σ
)
g(σ)
g
(
σ
)
零点迭代式和牛顿迭代式分别为
σ
k
+
1
=
ϕ
(
σ
k
)
σ
0
=
3
/
4
\sigma^{k+1} = \phi (\sigma^{k}) \\ \sigma^0 = 3/4
σ
k
+
1
=
ϕ
(
σ
k
)
σ
0
=
3
/
4
其中
ϕ
(
σ
)
=
1
−
12
α
(
a
+
σ
τ
)
.
ϕ(σ)=1−12α(a+στ).
ϕ
(
σ
)
=
1
−
1
2
α
(
a
+
σ
τ
)
.
下面利用 Python 中的迭代器进行序列
{
σ
}
k
=
0
∞
\{\sigma\}_{k=0}^{\infty}
{
σ
}
k
=
0
∞
的生成.
# -*- coding: utf-8 -*-
"""
Created on Mon Sep 28 21:54:48 2020
@author: Administrator
"""
import numpy as np
# 测试迭代序列的性能
def alpha(x):
return (2 + np.sin(x)) / 4
def alpha_derivitive(x):
return np.cos(x) / 4
def alpha_derivitive2(x):
return -np.sin(x) / 4
def phi(sigma, t_n, tau):
return 1 - 1 / 2 * alpha(t_n + sigma * tau)
def phi_newton(sigma, t_n, tau):
# return sigma - g(sigma, t_n, tau) / g_derivitive(sigma, t_n, tau)
return sigma - (sigma - phi(sigma, t_n, tau)) / (1 + tau / 2 * alpha_derivitive(t_n + sigma * tau))
def g(sigma, t_n, tau):
return sigma - phi(sigma, t_n, tau)
def g_derivitive(sigma, t_n, tau):
return 1 + tau / 2 * alpha_derivitive(t_n + sigma * tau)
# 定义一个利用迭代式的生成器
def generator_sigma(t_n, tau):
"""
Function:
生成特殊序列 sigma
Parameters:
num: 想要产生多少个 sigma
t_n: 在 t_n 处的固定值
"""
sigma = 3 / 4
yield sigma
while True:
sigma = phi(sigma, t_n, tau)
yield sigma
def generator_sigma_with_newton(t_n, tau):
"""
Function:
生成特殊序列 sigma
Parameters:
num: 想要产生多少个 sigma
t_n: 在 t_n 处的固定值
"""
sigma = 3 / 4
yield sigma
while True:
# sigma = sigma - g(sigma, t_n, tau) / g_derivitive(sigma, t_n, tau)
sigma = phi_newton(sigma, t_n, tau)
yield sigma
N = 20
T = 1
tau = T / N
tn = 8 * tau
# 生成 20 个数据
print('一般迭代序列数据:')
g = generator_sigma(tn, tau)
i = 0
while i < 20:
print(next(g))
i += 1
print('\n牛顿法迭代数据:')
g_newton = generator_sigma_with_newton(tn, tau)
j = 0
while j < 20:
print(next(g_newton))
j += 1
小结
利用迭代公式结合 Python 中的 yield 关键字计算了非线性方程的根. 其中 yield 关键字可以产生一个生成器.