используйте sympy, чтобы найти градиент и построить векторное поле - PullRequest
0 голосов
/ 25 марта 2019

Я написал некоторый код для использования sympy, чтобы найти градиент функции f (x, y) = x * y ** 2, а затем построить векторное поле из градиента.См. Ниже:

%matplotlib inline
import matplotlib.pyplot as plt
import sympy as sp
import numpy as np

sp.init_printing()
x,y = sp.symbols('x y')

def gradient(f):
    return (f.diff(x), f.diff(y))

f = x*y**2
g = gradient(f)
g

X,Y = np.meshgrid(np.linspace(-3,3,15), np.linspace(-3,3,15))

U=[g[0].subs({x:x1, y:y1}) for (x1,y1) in zip(X,Y)]
V=[g[1].subs({x:x1, y:y1}) for (x1,y1) in zip(X,Y)]

plt.quiver(X,Y,U,V, linewidth=1)
plt.title("vector field")
plt.show()

Что меня интересует, так это почему в этом коде не работает функция symps "subs".Он просто возвращает выражение, не вставляя значения X и Y для вычисления в числовое значение, вместо этого он просто возвращает объект sympy без каких-либо подстановок.

1 Ответ

0 голосов
/ 25 марта 2019

vector field

Проблема с вашим кодом в том, что вам нужен доступ к сетке в виде двумерного массива.

Пример: U [i, j] не U [i]

%matplotlib inline
import matplotlib.pyplot as plt
import sympy as sp
import numpy as np

sp.init_printing()
x,y = sp.symbols('x y')

def gradient(f):
    return (f.diff(x), f.diff(y))

f = x*y**2
g = gradient(f)
g

xrange = np.linspace(-3,3,15)
yrange = np.linspace(-3,3,15)
X,Y = np.meshgrid(xrange, yrange)

U=X
V=Y

for i in range(len(xrange)):
    for j in range(len(yrange)):
        x1 = X[i,j]
        y1 = Y[i,j]
        U[i,j] = g[0].subs({x:x1, y:y1})
        V[i,j] = g[1].subs({x:x1, y:y1})

plt.quiver(X,Y,U,V, linewidth=1)
plt.title("vector field")
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...