【问题标题】:Problemm calculating a summation计算总和的问题
【发布时间】:2019-05-02 18:43:00
【问题描述】:

我正在尝试计算总和作为类分配的一部分,以开发梯度方法的代码。求和是我需要找到最小值的目标函数。计算总和时出现此错误“RuntimeWarning:double_scalars y = y + (-0.01*i + exp(-(1/x1)*((u - x2)**x3))**2) 中遇到的值无效”。

为什么会这样?我该如何解决?

from sympy import *
from numpy import *
x1 = 1
x2 = 50
x3 = 1
def f(x1,x2,x3): 
    y = 0
    for i in range(1,100):
        u = (25+(-50*log(0.01*i))**(2/3))
        print(u)
        y = y + (-0.01*i + exp(-(1/x1)*((u - x2)**x3))**2)


        print(f'y{i} : {y}')
    return y

y1 = f(25,50,1.25)
y2 = f(26,51,2.25)


print(f'y1: {y1}')
print(f'y2: {y2}')

【问题讨论】:

  • 在提出问题时,您应该将完整的错误回溯放在您的问题中,因为回溯中有隐藏的线索。
  • 谢谢@Hoog。我添加了完整的错误消息。
  • 您可能会发现这篇文章很有用:stackoverflow.com/questions/27784528/…

标签: python


【解决方案1】:

您需要在u 中进行转换,请参阅:

u = float((25+(-50*log(0.01*i))**(2/3)))

【讨论】:

    【解决方案2】:

    经过几次循环后,您尝试将负数提高到非整数幂。我添加了一些打印语句来弄清楚发生了什么,就在您收到(u - x2) = -0.6175251618426216x3 = 1.25 的警告之前。将负数提高到分数幂将得到一个复数,numpy 假设您不想要它,因此它会引发警告并返回 None。您可以通过将您的输入之一转换为complex 来告诉 numpy 使用复数:

    from numpy import *
    x1 = 1
    x2 = 50
    x3 = 1
    def f(x1,x2,x3): 
        y = 0
        for i in range(1,100):
            u = (25+(-50*log(0.01*i))**(2/3))
            print("u:",u)
            print("y:",y)
            print("x1:",x1)
            print("x2:",x2)
            print("x3:",x3)
            print("calc:",(complex(u - x2)))
            y = y + (-0.01*i + exp(-(1/x1)*(complex(u - x2)**x3))**2)
    
    
            #print(f'y{i} : {y}')
        return y
    
    y1 = f(25,50,1.25)
    y2 = f(26,51,2.25)
    
    
    print(f'y1: {y1}')
    print(f'y2: {y2}')
    

    这将给出复数的结果,您需要检查您的理论如何处理它(可能通过取大小或实部)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 2014-09-16
      相关资源
      最近更新 更多