python 中不断发展的功能

Evolving functions in python

更新问题


根据我最初的 post,使用 @Attack68 的代码,我创建了一个程序,该程序通过基于随机变量的乘法函数选择成功地进化了该函数。但是,现在我收到一条错误消息,指出列表索引必须是整数(尽管我很确定它们是整数),我不确定发生了什么,代码如下:

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 quad 集成器无法调用此函数的形式,关于如何在每次迭代中集成不断发展的函数的任何建议都会也受到赞赏。


原文:

我正在 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 quad 积分器调用。

我曾尝试使用数组来操纵分布,并且它在函数进化过程中起作用,但在集成时,它给出了 numpy.trapz 的错误结果,我无法弄清楚原因。 Sci-pys quad integrator 无论如何都更准确,我已经设法让它在第一次迭代之前工作,但它需要一个基于函数的输入,所以如果没有这个函数进化我就不能使用它。

如果有人能告诉我 if/how 这个功能进化是可能的,那就太好了。如果不可能,也许有人可以尝试帮助我了解 numpy.trapz 实际做了什么,以便我可以锻炼如何修复它?

您的描述表明您的迭代值是通过产品组合在一起的,实际上并不是函数的组合。记录这些的一个简单方法是拥有一组基本函数:

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)

这个怎么样:

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。稍后您添加更多功能,它 returns 是所有功能的产物。