Интегрируйте функцию списка лямбда в Python

Указатели функций в C

Начнем с основной функции, которую мы будем , указывающей на :

int addInt(int n, int m) {
    return n+m;
}

. Прежде всего, определим a указатель на функцию, которая получает 2 int s и возвращает int:

int (*functionPtr)(int,int);

Теперь мы можем смело указать на нашу функцию:

functionPtr = &addInt;

Теперь, когда мы есть указатель на функцию, давайте использовать ее:

int sum = (*functionPtr)(2, 3); // sum == 5

Передача указателя на другую функцию в основном одинакова:

int add2to3(int (*functionPtr)(int, int)) {
    return (*functionPtr)(2, 3);
}

Мы можем использовать указатели функций в возвращаемых значениях (старайтесь не отставать, он становится беспорядочным):

// this is a function called functionFactory which receives parameter n
// and returns a pointer to another function which receives two ints
// and it returns another int
int (*functionFactory(int n))(int, int) {
    printf("Got parameter %d", n);
    int (*functionPtr)(int,int) = &addInt;
    return functionPtr;
}

Но гораздо удобнее использовать typedef:

typedef int (*myFuncDef)(int, int);
// note that the typedef name is indeed myFuncDef

myFuncDef functionFactory(int n) {
    printf("Got parameter %d", n);
    myFuncDef functionPtr = &addInt;
    return functionPtr;
}
0
задан Adriaan 13 July 2018 в 09:13
поделиться

1 ответ

Не используйте quad для функции, которая возвращает список из двух функций - вместо этого дважды используйте две функции для двух функций, а затем составляйте результаты в список. Документация для scipy.integrate.quad дает возможные сигнатуры для интегрируемой функции, и каждая сигнатура показывает, что функция должна возвращать значение double (называемое float в Python), а не список.

Если вы не можете изменить определения time_start или fun или параметры или возвращаемое значение integral, вы можете использовать этот код.

from math import cos, sin
from scipy.integrate import quad

# Global variables and constants used in function `integral`
time_start = 0
fun = lambda time: [cos(time), sin(time)]

# The desired function
def integral(time):
    """Return a list of two items containing the integrals of the two
    components of the `fun` function from `start_time` to `time`.
    """
    def fun0(time):
        return fun(time)[0]
    def fun1(time):
        return fun(time)[1]

    integral0 = quad(fun0, time_start, time)[0]
    integral1 = quad(fun1, time_start, time)[0]
    return [integral0, integral1]

Тогда результатом утверждения

print(integral(0), integral(pi/2), integral(pi))

является

[0.0, 0.0] [0.9999999999999999, 0.9999999999999999] [3.6775933888827275e-17, 2.0]

, что вы хотите, с точностью до ошибки.


путь, используя выражение lambda для создания функции, тогда присвоение имени имени считается плохой практикой программирования в Python. См. здесь , пятый пункт. Вместо этого используйте обычный блок def:

def fun(time):
    return [cos(time), sin(time)]

def integral(time):
    # as shown above

Конечно, использование time_start и fun в качестве глобальных переменных, а не как параметры integral, также является плохой практикой, но я придерживался того, как вы их использовали.

1
ответ дан Rory Daulton 17 August 2018 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: