Для проекта колледжа в python с использованием Sympy мне нужно оценить результат символьной функции 2 var после частичной подстановки, например:
f = (x-1)/sqrt ((x-10) ^ 2+ (y-10) ^ 2)/x = 1 => f = 0
Если я использую 1 var func, он отлично работает:
>>> from sympy import *
>>> x = symbols('x')
>>> F = 1-x
>>> F.evalf(subs={x: 1})
0.e-125
Но в случае функции 2 var subs, похоже, не делает права на замещение:
>>> from sympy import *
>>> x,y = symbols('x y')
>>> F = (x-1)/sqrt((x-10)**2+(y-10)**2)
>>> F.evalf(subs={x: 1})
(x - 1.0)*((x - 10.0)**2 + (y - 10.0)**2)**(-0.5)
Я ожидал, что F = 0, так как x = 1
Я не эксперт по sympy, но нашел встречный пример, когда значение y
делает выражение отличным от нуля:
>>> F.evalf(subs={x:1,y:float("nan")})
nan
когда y
является nan
, результат не равен нулю. Таким образом, невозможно упростить выражение, не зная значения y
(примечание: sympy радостно оценивает F.evalf(subs={x:1,y:oo})
до 0, даже если результат также должен быть наном)
Как упоминалось выше, если y = nan создает математическое исключение, и поэтому замена никогда не произойдет. Но я узнал, если я просто использую subsys, тогда я получаю то, что хочу:
>>> F.subs(x,1)
0
теперь, если я явно подставляю y = nan только тогда, я получаю ответ nan
>>> F.subs(y,nan)
nan
Im guessing evalf просто проверяет больше исключений, прежде чем оценивать замену.