Попытка вычислить, а затем показать вектор градиента функции - PullRequest
0 голосов
/ 19 января 2020

Мне удалось создать программу, которая отображает как трехмерный график функции с двумя переменными, так и векторное поле градиента функции, но затем я хотел, чтобы он сам вычислял градиент, но я продолжаю получать isinfinite ошибки от plt.quiver(). Я чувствую, что отчасти причина в том, что я возвращаюсь назад и вперед от numpy и обозначаю сочувствую для x и y, но я понятия не имею, что делать в этом случае.

def z_func(x,y):
    return (x**2+y**2)

def show_graph():
    x,y = np.meshgrid(np.linspace(-15,15,20),np.linspace(-15,15,20))
    z = z_func(x,y)

    fig = plt.figure(2)
    ax = fig.gca( projection='3d')
    surf = ax.plot_surface(x,y,z,rstride=1,cstride=1)


    ax.set_xlabel('X', fontweight = 'bold', fontsize = 14)
    ax.set_ylabel('Y', fontweight = 'bold', fontsize = 14)
    ax.set_zlabel('Z', fontweight = 'bold', fontsize = 14)

plt.title('Ahem', fontweight = 'bold', fontsize = 16)

def get_grad():
    x = sy.Symbol('x')
    y= sy.Symbol('y')
    f = z_func(x,y)
    gradi = sy.diff(f,x)
    gradj = sy.diff(f,y)
    show_vector(gradi,gradj)

def show_vector(gradi,gradj):
    a = sy.Symbol('x')
    b = sy.Symbol('y')
    u = gradi
    v = gradj

print('[{0},{1}]'.format(u,v))
a,b = np.meshgrid(np.linspace(-10,10,10),np.linspace(-10,10,10))
print('[{0},{1}]'.format(u,v))

figv = plt.figure(1)    
plt.xlabel('X')
plt.ylabel('Y')
plt.quiver(a,b,u,v)

def lazy():
    get_grad()
    show_graph()
    plt.show()

lazy()

1 Ответ

1 голос
/ 19 января 2020

Если вы хотите использовать выражения sympy вне sympy, вам нужно lambdify.

Этот код выполняет то, что вы ожидали?

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import sympy as sy

def z_func(x, y):
    return (x ** 2 + y ** 2)

x = sy.Symbol('x')
y = sy.Symbol('y')
f = z_func(x, y)
gradi = sy.diff(f, x)
gradj = sy.diff(f, y)
np_gradi = sy.lambdify(x, gradi, 'numpy')
np_gradj = sy.lambdify(y, gradj, 'numpy')

a, b = np.meshgrid(np.linspace(-10, 10, 10), np.linspace(-10, 10, 10))
u = np_gradi(a)
v = np_gradj(b)

x, y = np.meshgrid(np.linspace(-15, 15, 20), np.linspace(-15, 15, 20))
z = z_func(x, y)

fig = plt.figure(2)
ax = fig.gca(projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1)

ax.set_xlabel('X', fontweight='bold', fontsize=14)
ax.set_ylabel('Y', fontweight='bold', fontsize=14)
ax.set_zlabel('Z', fontweight='bold', fontsize=14)

figv = plt.figure(1)
plt.xlabel('X')
plt.ylabel('Y')
plt.quiver(a, b, u, v)
plt.show()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...