【问题标题】:Translating Matlab @ into Python code (RuntimeWarning: invalid value encountered in true_divide )将 Matlab @ 转换为 Python 代码(RuntimeWarning:在 true_divide 中遇到无效值)
【发布时间】:2019-06-12 11:04:55
【问题描述】:

我正在将 Matlab 代码翻译成 python,但我被困在这里。 我认为@它正在创建一个局部变量,对吗? 我试图用嵌套函数来引用代码,但在处理其中一个变量时似乎有问题。

#Code's variable:

#LL0 = first tentative value
#Sad and f = returns of psd estimation via welch's 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.

我得到的回报值与我用作暂定值的值相同 谁能帮我?提前致谢

【问题讨论】:

  • 请注明以上代码是matlab还是python。不过,它看起来像 matlab。
  • 谷歌搜索“matlab arrobas 表示 site:stackoverflow.com”给了我 2 个很好的答案。下次在问同样的问题之前使用它。谢谢
  • 您好,感谢您的及时答复。顺便说一句,我很了解 @ 在 matlab 中的作用,但它确实是一个不错的标题。无论如何我的问题是如何在 python 中翻译它,而你建议的答案都没有解决我的问题。
  • .* 似乎是矩阵乘法。不确定您是否在 python 中正确翻译了该内容。在你的情况下,@ 正在创建一个本地 function (但你得到了正确的部分)
  • “它似乎不起作用”也不是一个有效的问题。请附上minimal reproducible example,显示什么不起作用,以便其他人可以复制。离开关闭的 ATM。

标签: python matlab scipy fminsearch


【解决方案1】:

终于找到了解决办法;我不太确定为什么现在它正在工作,认为我分配了两次相同的变量。无论如何,这是我的解决方案:

    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 idle 一直说我不应该使用 lambda 函数,而是定义一个函数。谁能告诉我为什么?我能够将“乐趣”转化为功能;我试过了:

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

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

但它不起作用。如果有人能告诉我为什么会很好。

感谢您的帮助

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多