import numpy as np
import scipy.integrate as integrate
x=np.linspace(0.0,1.0,100)
n=10 #iterations
d=700.0
def f(x):
return np.sin(x)
def g(x,list_):
return np.cos(x)*apply(x,list_)
base = [f, g]
list_ = list()
for i in range(n):
testvar=np.random.randint(1, 100, 1)
if testvar> 50 and i!=0:
func_idx = 0 # choose a random operation: 0=ten, 1=inv
else:
func_idx= 1
list_.append(func_idx)
# now you have a list of indexes referencing your base functions so you can apply them:
def apply(x,list_):
y = 1
for i in range(len(list_)):
y *= base[list_[i]](x)
return y
print(list_)
#testint=integrate.quad(apply(x,list_),-d,d)[0]
#print(testint)
print(apply(list_, x))
我现在收到错误:
TypeError: list indices must be integers or slices, not numpy.float64
我也试图让它在每次迭代后集成新函数,但似乎该函数的形式不能由 scipys 四元积分器调用,任何有关如何在每次迭代上集成演化函数的建议也将不胜感激。
我正在用 python 创建一个模拟,其中我考虑一个在循环中演化的函数。该函数开始定义为:
def f(x):
return 1.0
简单来说就是扁平分布。在循环的每次迭代之后,我希望根据某些(随机)条件重新定义该函数。它可以乘以 cos(b*x),也可以乘以某个函数 A(x),由于随机性,每次的演化不会相同,所以我不能每次都简单地乘以相同的值。
一种情况下的进展可能是:
f(x)----> f(x)*A(x)----> f(x)*A(x)*A(x)...
但在另一种情况下可能是:
f(x)----> f(x)*A(x)----> f(x)*A(x)*cos(x)...
或
f(x)----> f(x)*cos(x)----> f(x)*cos(x)*cos(x)...
等等。 在每次演化的 n 次迭代之后,我必须计算与该函数相关的积分,因此我需要在每次迭代之后更新该函数,以便由 scipys 四元积分器调用。
我尝试使用数组来操纵分布,并且它在函数演化过程中有效,但在集成时,它给出了 numpy.trapz 的错误结果,我无法弄清楚为什么。无论如何,Sci-pys 四元积分器更准确,我之前已经设法让它在第一次迭代中工作,但它需要基于函数的输入,所以如果没有这个函数演化,我就无法使用它。
如果有人可以向我展示这种功能进化是否/如何可能,那就太好了。如果不可能,也许有人可以尝试帮助我理解 numpy.trapz 实际上做了什么,这样我就可以解决它?
这个怎么样:
class MyFunction:
def __init__(self):
def f1(x):
return 1.0
self.functions = [f1]
def append_function(self, fn):
self.functions.append(fn)
def __call__(self, x):
product = 1.0
for f in self.functions:
product *= f(x)
return product
这个对象一开始只是简单地返回 1.0。稍后您添加更多函数,它会返回所有函数的乘积。
您的描述表明您的迭代值是通过产品组合而成的,实际上并不是函数的组合。记录这些的一个简单方法是拥有一组基本函数:
import numpy as np
import scipy.integrate as int
def two(x):
return x*2
def inv(x):
return 1/x
base = [two, inv]
funcs = np.random.choice(base, size=10)
def apply(x, funcs):
y = 1
for func in funcs:
y *= func(x)
return y
print('function value at 1.5 ', apply(1.5, funcs))
answer = int.quad(apply, 1, 2, args=(funcs,))
print('integration over [1,2]: ', answer)