2015-08-28 7 views
2

У меня есть функцияМногофакторный дифференциация в Python

Multivariate function , что я хочу, чтобы упростить и дифференцироваться в Python, определяемый как **

def u(x, t): 
    return math.erf((x + 1)/(2 * (k * t) ** (1/2))) 

** Пожалуйста, поправьте меня, если я ошибаюсь.

У меня есть весь необходимый импорт следующим образом:

import math 
import scipy 
import matplotlib 
from sympy import * 

Как Определяя символы

x, k, t = symbols('x k t') 

Это отлично работает:

def f(x): 
    return x ** 4 

diff(f(x)) 

Который возвращает правильный ответ ,

4x^3

Однако это

diff(u(x, t)) 

или это

diff(u(x, t), t) 

возвращает ошибку следующим образом

TypeError Traceback (most recent call last) in() ----> 1 diff(u(x, t))

in u(x, t) 1 def u(x, t): ----> 2 return math.erf((x + 1)/(2 * (k * t) ** (1/2)))

C:\Anaconda\lib\site-packages\sympy\core\expr.py in float(self) 223 if result.is_number and result.as_real_imag() 1 : 224 raise TypeError("can't convert complex to float") --> 225 raise TypeError("can't convert expression to float") 226 227 def complex(self):

TypeError: can't convert expression to float

В Matlab я мог бы легко сделать это:

syms x; 
syms k; 
syms t; 
u = erf((x + 1)/(2 * sqrt(k * t))); 
LHS = simplify(diff(u, t)) 
RHS = k * simplify(diff(u, x, 2)) 

Мой вопрос в том, как я могу дифференцировать и/или упростить математическую функцию более чем одной переменной в Python?

+2

Читали [эта документация] (http://docs.sympy.org/dev/tutorial/calculus.html#derivatives)? – BrenBarn

+0

Да, я прочитал документацию SymPy, однако я не уверен, как работает синтаксис в отношении следующего: 'expr = exp (x * y * z)' 'diff (expr, x, y, y, z, z, z, z) ' – EfVonZee

+0

Кроме того, если я определяю свою собственную функцию как таковую: expr = math.erf ((x + 1)/(2 * (k * t) ** (1/2))) и попытайтесь дифференцировать по отношению к t 'diff (expr, t)' Я получаю сообщение об ошибке. – EfVonZee

ответ

3

Вы должны использовать sympy.erf, не math.erf:

>>> import sympy 
>>> x, k, t = sympy.symbols('x k t') 
>>> def u(x, t): 
...  return sympy.erf((x + 1)/(2 * (k * t) ** (1/2))) 
>>> sympy.diff(u(x, t), x, t) 
(0.25*(k*t)**(-1.5)*(x + 1)**2 - 0.5*(k*t)**(-0.5))*exp(-(k*t)**(-1.0)*(x + 1)**2/4)/(sqrt(pi)*t) 
+0

У меня пока нет ошибки! Спасибо огромное! Однако мой ответ возвращается как 0. Как вы импортировали 'sympy' и определяете символы? – EfVonZee

+0

Я просто «import sympy», а затем ваши же символы «x, k, t = (« x k t »)». – BrenBarn

+0

моя все еще возвращает 0. Я понятия не имею, почему. 'import sympy x, k, t = символы ('xk t') def u (x, t): return sympy.erf ((x + 1)/(2 * (k * t) ** (1/2))) sympy.diff (u (x, t), x, t) ' – EfVonZee

2

Использование sympy так:

>>> from sympy import symbols, diff 
>>> x, y = symbols('x y', real=True) 
>>> diff(x**2 + y**3, y) 
3*y**2 
>>> diff(x**2 + y**3, y).subs({x:3, y:1}) 
3 

Вы должны указать, какие переменные вы дифференцированием.

+0

Я импортирую 'from sympy import *'. Кроме того, 'diff (u (x, t), t)' также возвращает ошибку. – EfVonZee

+1

Я думаю, что проблема может быть с константой 'k'. Я не уверен, как это можно решить, я бы посоветовался с документацией @BrenBarn. – cadams

+2

OH! Я думаю, что ваша проблема может быть вызвана использованием символа 'k'. Попробуйте удалить его из списка символов. – cadams

Смежные вопросы