我正在尝试将总和作为类分配的一部分来开发梯度方法的代码。求和是我需要找出最小值的目标函数。计算总和时,我收到此错误“ 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}')
答案 0 :(得分:0)
您需要在u
中进行强制转换,请参阅:
u = float((25+(-50*log(0.01*i))**(2/3)))
答案 1 :(得分:0)
经过几次循环后,您尝试将负数提高为非整数幂。在警告您有$ groovy -v
Groovy Version: 2.4.11 JVM: 1.8.0_191 Vendor: Oracle Corporation OS: Linux
和(u - x2) = -0.6175251618426216
之前,我添加了一些打印语句以查明问题所在。将负数提高到小数幂将得到一个复数,因此numpy假设您不需要该数,因此抛出警告并返回x3 = 1.25
。您可以通过将其中一种输入类型强制转换为None
来告诉numpy使用复数:
complex
这将给出复数形式的结果,您需要与您的理论核实如何处理(可能是通过取振幅或实部)。