Итерация для определения функции - PullRequest
0 голосов
/ 26 января 2020

Я хотел бы сделать итерацию, чтобы получить функцию, проверяющую интегральное уравнение. Интегральный оператор скрыт в функции lambdaop. Тем не менее, я просто не могу повторить процесс, получая ошибку

Файл "blablabla / .spyder-py3 / temp.py", строка 11, в подынтегральном выражении -0.5 * f (x) * scipy .special.expi (-abs (x-tau))

Ошибка типа: невозможно умножить последовательность на не-int типа 'float'

, который я не понимаю. Я сделал здесь только две функции, моей конечной целью было бы сделать n итераций. Я предполагаю, что ошибка происходит из-за способа определения функции, которая не подходит (возможно, не использовать «лямбда-определения» ...), но я не хочу создавать вектор размера n вместо функции, так как я хочу интегрировать это после. У кого-нибудь есть идеи, как решить эту проблему?

import numpy as np
import matplotlib.pyplot as plt
import math
import scipy.integrate
import scipy.special

def initial(x):
    return x + 2/3

def integrand(f,x,tau):
    return -0.5*f(x)*scipy.special.expi(-abs(x-tau))

def lambdaop(f,x,tau):
    def step(x,tau):
        return integrand(f,x,tau)
    g = lambda tau: scipy.integrate.quad(step,0,np.inf,args=(tau,))
    return g

g = lambdaop(initial,1,2)
h = lambdaop(g,1,2)
print(h(5))

x = np.linspace(0,3,101)
y = np.linspace(0,3,101)
for i in np.arange(101):
     y[i] = h(x[i])[0]

plt.plot(x,y)
plt.show()

Я не видел других топи c, подобных моей, но если это дубликат, извините, пожалуйста.

1 Ответ

1 голос
/ 26 января 2020

Добавьте несколько операторов печати в функцию integrand.

Например,

def integrand(f,x,tau):
    print('-------')
    print('args:', f, x, tau)
    v = f(x)
    print(f'f({x})={v}')
    s = scipy.special.expi(-abs(x-tau))
    print(f's={s}')
    result = -0.5*v*s
    print('=====')
    return result

, и вы увидите, что:

f(1.0)=(inf, inf)
s=-0.0037793524098489063

The (inf, inf) - это то, откуда приходит сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...