многопараметрическая линеаризация в python: у объекта 'Pow' нет атрибута 'sqrt' - PullRequest
0 голосов
/ 23 ноября 2018

Как новичок в мире Python, я просто собираюсь линеаризовать следующие две переменные функции:

function

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 голосов
/ 23 ноября 2018

Я сузил вашу ошибку до этого:

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

Видимо, после вашего объекта sympyбыл обработан dot, он стал Pow объектом, который является симпатичным объектом, с которым np.sqrt понятия не имеет, что делать.

Причина этого, очевидно, в том, что вы не может использовать numpy функцию для sympy объектов.Pow является симпатичным объектом и как таковой numpy.sqrt не может работать с этим объектом.

После дополнительных исследований, по-видимому, этот вопрос давным-давно sympy AttributeError: у объекта 'Pow' нет атрибута 'sin' и указывают на ту же причину.

0 голосов
/ 23 ноября 2018

Вы не звонили sqrt, но np.linalg.norm звонил.Аргументы arg1, arg2 имеют тип sympy.Symbol.Функция ожидает получить аргумент в виде массива.Тем не менее, он получает симпатичный символ, с которым он не знает, как обращаться.

Я посмотрел в исходном коде np.linalg, и кажется, что он проверяет некоторые известные типы и пытается найти квадратный корень.В противном случае он опирается на сам аргумент, чтобы узнать свой квадратный корень.sympy.Symbol не имеет такой вещи, и, следовательно, ошибка.

Нет способа избежать этого. numpy работает с числами , sympy работает с (своими) символами.Вы не должны смешивать их.Скорее всего, sympy будет иметь свои собственные функции для обработки своих собственных символов, но если нет, то вам не повезет, если вы не добавите их самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...