Найти корень производной абсолютного значения комплексного числа в симпы

1

По сути, я хочу принять абсолютное значение комплексного числа, которое имеет параметр как в реальной, так и в мнимой частях и выводит это по отношению к этому параметру. Затем я хочу знать, для какого значения этого параметра производная равна нулю. Поэтому по существу я хочу знать 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

Теги:
sympy
symbolic-math

1 ответ

0
Лучший ответ

Это то, что линии 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]. Конечно, вам может понадобиться числовой решатель в более сложных ситуациях; но затем убедитесь, что все, кроме переменной (ов), решаемой для, имеет числовое значение.

  • 0
    Спасибо, я действительно искал что-то вроде real = true, потому что приятель рекомендовал это, но не смог найти что-то. Что касается решателя, который был ошибкой в примере здесь, в моей реальной реализации есть только один символ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню