python中的多变量线性化:“ Pow”对象没有属性“ sqrt”

时间:2018-11-23 14:56:24

标签: python numpy

作为Python世界的新手,我只是要将以下两个变量函数线性化:

功能

enter image description here

使用相当常规的牛顿法:

线性化方法

enter image description here

这是我到目前为止尝试过的:

import numpy as np
import math
from sympy import symbols, diff

d = 1.7

def f(arg1, arg2):
    return (arg1 - arg2)/(np.power(np.linalg.norm(arg1 - arg2),2) - np.power(d,2))

def linearize_f(f, arg1, arg2, equi_arg1, equi_arg2):
    arg1, arg2 = symbols('arg1 arg2', real=True)
    der_1 = diff(f(arg1,arg2), arg1)
    der_2 = diff(f(arg1,arg2), arg2)
    constant_term = f(equi_arg1, equi_arg2)

    vars = sympy.symbols('arg1, arg2')
    par_term_1 = sympy.evalf(der_1, subs = dict(zip(vars,[equi_arg1, equi_arg2])))
    par_term_2 = sympy.evalf(der_2, subs = dict(zip(vars,[equi_arg1, equi_arg2])))

    result = constant_term + par_term_1*(arg1-equi_arg1) + par_term_2*(arg2-equi_arg2)

    return result

q0, q1 = symbols('q0 q1', real=True)
result = linearize_f(f,q0,q1,0,0)
print(result)

解释器返回一个'Pow' object has no attribute 'sqrt'。但是,我从未在代码中使用任何sqrt

您能帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

您尚未致电${#strings.arraySplit(yourString, '/')[#arrays.length(#strings.arraySplit(yourString, '/')) - 1]} ,但已致电sqrtnp.linalg.norm自变量的类型为arg1, arg2。该函数希望获得类似数组的参数。但是,它得到一个符号符号,它不知道如何处理。

我查看了sympy.Symbol源代码,似乎它检查了一些已知类型并试图找到平方根。否则,它将依靠参数本身来知道其自己的平方根。 np.linalg没有这种东西,因此是错误。

没有办法避免这种情况。 numpy 数字一起使用,sympy与(自己的)符号一起使用。您不应该将它们混合在一起。 sympy 最有可能具有自己的功能来处理自己的符号,但是,如果没有,除非您自己添加它们,否则您很不走运。

答案 1 :(得分:3)

我已将您的错误缩小为:

q0, q1 = symbols('q0 q1', real=True)
np.linalg.norm(q0 - q1) # Throws the same error

这是np.linalg中引发错误的源代码:

2347 
2348     # Immediately handle some default, simple, fast, and common cases.
2349     if axis is None:
2350         ndim = x.ndim
2351         if ((ord is None) or
2352             (ord in ('f', 'fro') and ndim == 2) or
2353             (ord == 2 and ndim == 1)):
2354 
2355             x = x.ravel(order='K')
2356             if isComplexType(x.dtype.type):
2357                 sqnorm = dot(x.real, x.real) + dot(x.imag, x.imag)
2358             else:
2359                 sqnorm = dot(x, x)
2360             ret = sqrt(sqnorm)
2361             if keepdims:
2362                 ret = ret.reshape(ndim*[1])
2363             return ret

显然,在dot处理了sympy对象之后,它变成了Pow对象,这是一个np.sqrt不知道如何处理的sympy对象。

这显然是因为您不能numpy对象使用sympy函数。 Pow是一个sympy对象,因此numpy.sqrt无法对此对象进行操作。

经过更多的研究,很显然,很久以前的这个问题sympy AttributeError: 'Pow' object has no attribute 'sin'也指向相同的原因。