Python 中的演化函数

问题描述 投票:0回答:2

更新问题


继我原来的帖子之后,通过使用 @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 四元积分器调用,任何有关如何在每次迭代上集成演化函数的建议也将不胜感激。


原:

我正在用 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 实际上做了什么,这样我就可以解决它?

python numpy lambda scipy numerical-integration
2个回答
3
投票

这个怎么样:

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。稍后您添加更多函数,它会返回所有函数的乘积。


2
投票

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

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)
© www.soinside.com 2019 - 2024. All rights reserved.