gpt4 book ai didi

python - 透明地将数字类型处理为单值序列(反之亦然)

转载 作者:行者123 更新时间:2023-11-30 23:44:01 25 4
gpt4 key购买 nike

我开始通过编写 ODE 求解器来学习 Python。我想透明地处理一变量或多变量输入函数。这是我的欧拉方法一步的代码:

def euler(h, t, y, f):
return (y + h*f for y,f in zip(y,f(t,y)))

现在我定义两个函数,f1f2,如下所示:

def f1(t,y):
return -2*t*y

def f2(t,y):
x, y = y #is rebinding usually ok, or confusing?
return (x - t*y, y + x/t)

当我测试它们时,这就是(显然)发生的事情

>>> list(euler(0.01, 1, (1,2), f2))
[0.99, 2.03]
>>> list(euler(0.01, 1, 1, f1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in euler
TypeError: zip argument #1 must support iteration

如果给定的函数适用于一个或多个变量,我希望求解器能够透明地处理,但还没有找到一种很酷的方法来做到这一点。我发现的一种方法是

import operator as op
def euler(h, t, y, f):
if op.isNumberType(y):
return (y + h*f(t,y),)
return (y + h*f for y,f in zip(y,f(t,y)))

但是现在我传递了一个 float 并返回了一个可迭代对象,因此 list(euler(...)) 可以成功。但是,例如,我无法调用 f(t,euler(...))

有没有一种方法可以将单例序列作为原始类型来处理,或者将原始作为单例序列来处理,而无需进行无休止的检查?我所说的“无休止的检查”是指,只需检查几个地方,而不是检查整个代码。或者我应该把它吸收起来并让 f(t,y) 需要一个序列而不是数字?

感谢您的帮助,也欢迎提供有关我的编码的建议!

最佳答案

让 f(t, y) 仅使用序列非常容易:

def euler(h, t, y, f):
return (y + h*v for y,v in zip(y,f(t,y)))

def f1(t,status):
x, = status
return -2*t*x,

def f2(t,status):
x, y = status
return x - t*y, y + x/t


print list(euler(0.01, 1, (1,2), f2))
print list(euler(0.01, 1, (1,), f1))

关于python - 透明地将数字类型处理为单值序列(反之亦然),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10376175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com