Это грязное решение:
import numpy as np
import matplotlib.pyplot as plt
from sympy.parsing.mathematica import mathematica
from sympy import symbols
def fun(x, a, b, c):
# string inside parse('') is my mathematica output
if a == 0:
out = mathematica('a (-I b + x) ArcTan[(b - a)/c]')
else:
out = mathematica('4 c a^2 Log[c^2 + (x - a)^2]')
return out
aa = 0.17
bb = 0.44
cc = 0.29
II = 1
xx = np.linspace(0, 50, int(1e3))
x, a, b, c, I = symbols('x, a, b, c, I')
fun1 = fun(x, a, b, c)
fun2 = fun1.subs({a: aa, c: cc})
print(fun2.evalf())
y_list = []
for item in xx:
y_list.append(fun2.subs({x:item}).evalf())
print(y_list[:10])
plt.figure()
plt.plot(xx, y_list,'.-')
plt.title('mathematica -> python conversion')
plt.show()
Я объясню позже, как все это работает.
Обновление
Как вы можете видеть, когда a == 0
, функция имеет значение 0
, вам нужно проверить это.
Когда вы используете mathematica
, тип fun1
является функцией sympy
(sympy.core.mul.Mul
), поэтому вы должны использовать symbols
и fun1.subs()
и fun2.evalf()
, другими словами, вам нужно знать, кто использует основные функции sympy
.
То, как вы оцениваете функцию для ее построения, ну, вы используете список:
y_list = []
for item in xx:
y_list.append(fun2.subs({x:item}).evalf())
Кстати, я использую sympy
версию 1.4.