python生成一个序列_Python如何生成无限序列

本文介绍了如何使用Python的`yield`关键字生成无限序列,特别是针对非线性方程的迭代求解。通过示例展示了如何生成函数g(σ)的零点迭代序列,并对比了一般迭代和牛顿迭代方法的实现。
摘要由CSDN通过智能技术生成

菜汤今天看了篇可变阶微分方程的论文, 其中涉及到了迭代序列的内容.

一般的, 数学上的迭代序列是无限的, 而编程语言中的迭代都是有限的.

利用 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 关键字可以产生一个生成器.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值