По сути, я хочу принять абсолютное значение комплексного числа, которое имеет параметр как в реальной, так и в мнимой частях и выводит это по отношению к этому параметру. Затем я хочу знать, для какого значения этого параметра производная равна нулю. Поэтому по существу я хочу знать Min/Max абсолютного значения комплексного числа с параметрами.
Я столкнулся с проблемой использования sympy и не знаю, как это исправить/если это проблема в конце. Прежде чем сообщить об этом в качестве ошибки, которую я хотел спросить здесь. Хорошо, так что это по сути то, что я хочу сделать (реализация немного сложнее, но ошибки одинаковы)
0 import sympy
1 import mpmath
2 sympy.init_printing() # enable pretty printing
3 a,b = sympy.symbols("a,b") # a and b are symbols a and b
4 c = a+ 1j*b # complex number a+ib
5 d = sympy.Abs(c) # absolute value of c
6 e = d.diff(b,1) # derive d in respect to b one time
7 f = sympy.lambdify(b,e) # lambdify e with b as parameter
8 g = mpmath.findroot(f,0) # find root of f starting at 0
Ошибка возникает в строке 8, но из-за f
. Вызов f
с f(1)
например, дает ту же ошибку. Ошибка:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <lambda>
NameError: name 'Derivative' is not defined
Я получил все, что работал, но только если я сам написал методы для таких вещей, как абсолютное значение, и избегал использования функций sympy. Так, например,
d = (sympy.re(c)**2 + sympy.im(c)**2)**0.5
работал отлично, но
d = sympy.sqrt(sympy.re(c)**2 + sympy.im(c)**2)
дал мне ошибку. Эта ошибка была по сути той же, что и описанная мной, но с Sqrt
вместо Add
. Было бы хорошо, если бы я сам писал эти методы, но поскольку функция динамически построена во время выполнения (это инструмент для электротехники), это не возможность просто подключить материал; Я должен полагаться на симпы.
Я также получил ошибку, которая была чем-то вроде:
Add doesn't contain Derivative Attribute.
что в основном означало, что комплексное число является экземпляром класса Add
для sympy и не имеет метода дифференцирования, но я не могу получить его для воспроизведения на данный момент.
Печать e.subs(a,5).subs(b,1)
также показывает, что она не заменяет a
и b
внутри Derivative()
.
Извините, что некоторые вещи немного расплывчаты, я изначально беспокоил все это вчера и забыл сохранить код. Если все это не ошибка в Sympy, а скорее ошибка с моей стороны, я искренне извиняюсь и хотел бы, чтобы она была направлена в направлении того, как это делается правильно.
Все это работает под Anaconda 5.1.0 и отлаживается/управляется в Visual Studio. Если вас интересует моя конкретная реализация, проект размещен на https://github.com/SV-97/iphipy
Интересными файлами являются System.py и Main.py
Это то, что линии 3-4 должны были быть
a, b = sympy.symbols("a, b", real=True) # a and b are REAL symbols a and b
c = a + I*b
По умолчанию a
и b
допускают комплексные числа, что делает вычисление Abs(a+I*b)
беспорядочным, а дифференцирование этого по отношению к b
математически сомнительным.
Кроме того, 1j
- плавающий Python, а I
- объект SymPy; используйте последнее в символических выражениях.
Теперь e
будет вычисляться как b/sqrt(a**2 + b**2)
. Но нет ничего, что mpmath.findroot
может сделать с этим выражением, учитывая, что он содержит символ a
, а mpmath.findroot
- это числовой решатель.
sympy.solve(e, b)
возвращает ответ, [0]
. Конечно, вам может понадобиться числовой решатель в более сложных ситуациях; но затем убедитесь, что все, кроме переменной (ов), решаемой для, имеет числовое значение.