Перевод Matlab @ в код Python (RuntimeWarning: недопустимое значение, встречающееся в true_divide)

1

Я перевожу код Matlab на python и застрял здесь. Я думаю, что с @это создает локальную переменную, верно? Я попытался передать код с помощью вложенной функции, но, похоже, возникла проблема с обработкой одной из переменных.

#Code variable:

#LL0 = first tentative value
#Sad and f = returns of psd estimation via welch method
#Sad = is the psd of discrete time-series
#f = is an array of the sampled frequencies
#u_mean = is a scalar

% Matlab Code
f = @(LL, Sad, n, U_media)sum((Sad - 4 * n * LL / U_media .* (1 + 70.8 * (n * LL / U_media).^2).^(-5/6)).^2);
fun = @(LL)f(LL, Sad, n, U_media);
LL = fminsearch(fun, LL0);
def f1(LL, Sad, n, u_mean):
    a = sum((Sad - 4 * n * LL / u_mean * (1 + 70.8 * (n * LL / u_mean)**2)**(-5/6))**2)
    return(a)
f2 = lambda LL, Sad, u_mean, f: f1(LL, Sad, n, u_mean)
fun = lambda LL: f2(LL, Sad, n, u_mean)
LL = scipy.optimize.fmin(func=fun, x0=LL0, maxfun=100000, xtol=1e-6, maxiter=10000, disp=True)

Код работает, но итерации дают мне этот вывод

RuntimeWarning: invalid value encountered in true_divide
  sum((S_adim - 4 * f * LL / u_mean * (1 + 70.8 * (f * LL / u_mean**2)**(-5/6)))**2)
RuntimeWarning: invalid value encountered in reduce
  return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
Warning: Maximum number of iterations has been exceeded.

Значение, которое я получаю взамен, совпадает с тем, которое я использовал в качестве приблизительного значения. Кто-нибудь может мне помочь? заранее спасибо

  • 0
    пожалуйста, укажите, является ли приведенный выше код matlab или python. Это похоже на Matlab, хотя.
  • 0
    Поиск в Google "Matlab Arrobas означает сайт: stackoverflow.com" дал мне 2 отличных ответа. Используйте это в следующий раз, прежде чем задавать тот же вопрос. Спасибо
Показать ещё 8 комментариев
Теги:
scipy
fminsearch

1 ответ

0

наконец-то нашел решение; я не очень уверен, почему теперь это работает, думаю, что я назначал одну и ту же переменную дважды. В любом случае, это решение, к которому я пришел:

    def f(LL, Sad, n, u_mean):
        f = sum((Sad - (4 * n * LL / u_mean) *
                 ((1 + 70.8 * ((n * LL / u_mean) ** (2)))**(-5 / 6)))**2)
        return(f)

    fun = lambda LL: f(LL, Sad, n, u_mean)
    res = scipy.optimize.minimize(fun=fun, x0=LL0)
    Lux = res.x

Кстати, spyder бездействует постоянно говорит, что я не должен использовать лямбда-функцию, а вместо этого определить функцию... может кто-нибудь сказать мне, почему? Я смог перевести "веселье" в функцию; Я пробовал с:

def fun(LL):
   f(LL, Sad, n, u_mean)
   return(f)

res = scipy.optimize.minimize(fun=fun, x0=LL0)

но это не работает Было бы хорошо, если кто-нибудь может сказать мне, почему.

Спасибо за вашу помощь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню