import os
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['contour.negative_linestyle'] = 'solid'
PLOHE = [
{'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: x**2 + y**2, 'shading': True},
{'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: -x**2 - y**2 + 61, 'shading': True},
{'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: x**2 - y**2, 'shading': True},
{'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: y**2 - x**2, 'shading': True},
{'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: x + y, 'shading': True, 'zticks': [-5,0,5]},
{'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: -x + y, 'shading': False},
{'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: x**2, 'shading': False},
{'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: -x**2 + 30, 'shading': False},
{'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: y**2, 'shading': True},
{'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: -y**2 + 30, 'shading': True},
{'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: -x, 'shading': False},
{'xkor':[-5, 5.9, 2], 'ykor':[-5, 5.9, 2], 'fun': lambda x,y: x, 'shading': False, 'elev': 20, 'azim': -40},
{'xkor':[-5, 5.9, 1.4], 'ykor':[-5, 5.9, 1.4], 'fun': lambda x,y: y, 'shading': False},
{'xkor':[-5, 5.9, 2], 'ykor':[-5, 5.9, 2], 'fun': lambda x,y: -y, 'shading': False, 'elev': 20, 'azim': -55},
{'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: y - np.sin(x), 'shading': True,
'zticks': [-5,0,5]},
{'xkor':[-5, 5.9, 0.8], 'ykor':[-5, 5.9, 0.8], 'fun': lambda x,y: x - np.sin(y), 'shading': True,
'zticks': [-5,0,5]},
{'xkor':[-5, 5.1, 0.5], 'ykor':[-5, 5.1, 0.5], 'fun': lambda x,y: 10 * 2**(-0.15 * (x**2 + y**2)),
'shading': True},
{'xkor':[-5, 5.1, 0.5], 'ykor':[-5, 5.1, 0.5], 'fun': lambda x,y: -10 * 2**(-0.15 * (x**2 + y**2)) + 11,
'shading': True},
{'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'fun': lambda x,y: 10 - np.abs(x) - np.abs(y), 'shading': True},
{'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'fun': lambda x,y: np.abs(x) + np.abs(y), 'shading': True},
{'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'fun': lambda x,y: np.abs(x) - np.abs(y) + 5, 'shading': True},
{'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'fun': lambda x,y: -np.abs(x) + np.abs(y) + 5, 'shading': True}
]
NIVO = [
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x**2 + y**2, 'levels': [2,8,18,30]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -x**2 - y**2 + 61, 'levels': [35,45,55,60]},
{'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: x**2 - y**2, 'levels': [-20,-10,-3,3,10,20],
'manual_loc': [(0, -5),(0,5),(0,3),(0,-3),(0,-1),(0,1),(-5,0),(5,0),(-3,0),(3,0),(-1,0),(1,0)]},
{'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: y**2 - x**2, 'levels': [-20,-10,-3,3,10,20],
'manual_loc': [(0, -5),(0,5),(0,3),(0,-3),(0,-1),(0,1),(-5,0),(5,0),(-3,0),(3,0),(-1,0),(1,0)]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x + y, 'levels': [-8,-6,-3,0,3,6,8]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -x + y, 'levels': [-8,-6,-3,0,3,6,8]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x**2, 'levels': [1,6,15]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -x**2 + 30, 'levels': [15,24,29]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: y**2, 'levels': [1,6,15]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -y**2 + 30, 'levels': [15,24,29]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -x, 'levels': [-4,-2,0,2,4]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x, 'levels': [-4,-2,0,2,4]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: y, 'levels': [-4,-2,0,2,4]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: -y, 'levels': [-4,-2,0,2,4]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: y - np.sin(x), 'levels': [-4,-2,0,2,4]},
{'xkor':[-5, 5.3, 0.2], 'ykor':[-5, 5.3, 0.2], 'fun': lambda x,y: x - np.sin(y), 'levels': [-4,-2,0,2,4]},
{'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: 10 * 2**(-0.15 * (x**2 + y**2)),
'levels': [1,3,6,9],
'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
{'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: -10 * 2**(-0.15 * (x**2 + y**2)) + 11,
'levels': [3,6,9,10],
'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
{'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: 10 - np.abs(x) - np.abs(y), 'levels': [2,4,6,8],
'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
{'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: np.abs(x) + np.abs(y), 'levels': [2,4,6,8],
'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
{'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: np.abs(x) - np.abs(y) + 5, 'levels': [2,4,6,8],
'xlim':[-5.5, 5.5], 'ylim': [-5.5, 5.5]},
{'xkor':[-5, 5, 0.2], 'ykor':[-5, 5, 0.2], 'fun': lambda x,y: -np.abs(x) + np.abs(y) + 5, 'levels': [2,4,6,8]}
]
GRADIJENT = [
{'xkor':[-5, 5, 1], 'ykor':[-5, 5, 1], 'dx': lambda x,y: 2*x, 'dy': lambda x,y: 2*y},
{'xkor':[-5, 6, 1], 'ykor':[-5, 6, 1], 'dx': lambda x,y: -2*x, 'dy': lambda x,y: -2*y},
{'xkor':[-5, 6, 1], 'ykor':[-5, 6, 1], 'dx': lambda x,y: 2*x, 'dy': lambda x,y: -2*y},
{'xkor':[-5, 6, 1], 'ykor':[-5, 6, 1], 'dx': lambda x,y: -2*x, 'dy': lambda x,y: 2*y},
{'xkor':[-5, 5, 1], 'ykor':[-5, 5, 1], 'dx': lambda x,y: 1, 'dy': lambda x,y: 1},
{'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'dx': lambda x,y: -1, 'dy': lambda x,y: 1},
{'xkor':[-5, 5, 1], 'ykor':[-4, 5, 1], 'dx': lambda x,y: 2*x, 'dy': lambda x,y: 0},
{'xkor':[-5, 5.3, 1.2], 'ykor':[-4.2, 5, 1.2], 'dx': lambda x,y: -2*x, 'dy': lambda x,y: 0},
{'xkor':[-5, 5, 1], 'ykor':[-3.7, 4, 1.2], 'dx': lambda x,y: 0, 'dy': lambda x,y: 2*y},
{'xkor':[-5, 5, 1], 'ykor':[-4.7, 5, 1.3], 'dx': lambda x,y: 0, 'dy': lambda x,y: -2*y},
{'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'dx': lambda x,y: -1, 'dy': lambda x,y: 0},
{'xkor':[-5, 5.1, 1], 'ykor':[-5, 5.1, 1], 'dx': lambda x,y: 1, 'dy': lambda x,y: 0},
{'xkor':[-5, 5, 1], 'ykor':[-4.8, 5, 1], 'dx': lambda x,y: 0, 'dy': lambda x,y: 1},
{'xkor':[-5, 5, 1], 'ykor':[-4, 5, 1], 'dx': lambda x,y: 0, 'dy': lambda x,y: -1},
{'xkor':[-5, 5, 1], 'ykor':[-5, 5, 1], 'dx': lambda x,y: -np.cos(x), 'dy': lambda x,y: 1},
{'xkor':[-5, 5, 1], 'ykor':[-5, 5, 1], 'dx': lambda x,y: 1, 'dy': lambda x,y: -np.cos(y)},
{'xkor':[-5, 5, 0.8], 'ykor':[-5, 5, 0.8], 'dx': lambda x,y: -3*2**(-3/20*x**2-3/20*y**2)*x*np.log(2),
'dy': lambda x,y: -3*2**(-3/20*x**2-3/20*y**2)*y*np.log(2)},
{'xkor':[-5, 5, 0.8], 'ykor':[-5, 5, 0.8], 'dx': lambda x,y: 3*2**(-3/20*x**2-3/20*y**2)*x*np.log(2),
'dy': lambda x,y: 3*2**(-3/20*x**2-3/20*y**2)*y*np.log(2)},
{'xkor':[-5, 5, 0.9], 'ykor':[-5, 5, 0.9], 'dx': lambda x,y: -x/np.abs(x) , 'dy': lambda x,y: -y/np.abs(y)},
{'xkor':[-5, 5, 0.9], 'ykor':[-5, 5, 0.9], 'dx': lambda x,y: x/np.abs(x) , 'dy': lambda x,y: y/np.abs(y)},
{'xkor':[-5, 5, 0.9], 'ykor':[-5, 5, 0.9], 'dx': lambda x,y: x/np.abs(x) , 'dy': lambda x,y: -y/np.abs(y)},
{'xkor':[-5, 5, 0.9], 'ykor':[-5, 5, 0.9], 'dx': lambda x,y: -x/np.abs(x) , 'dy': lambda x,y: y/np.abs(y)}
]
fig = plt.figure(figsize=(18,120))
for i in range(len(PLOHE)):
for j in range(3):
if j == 0:
ax=fig.add_subplot(len(PLOHE),3,3*i+1, projection='3d')
p = PLOHE[i]
xkor = np.arange(*p['xkor'])
ykor = np.arange(*p['ykor'])
X, Y = np.meshgrid(xkor,ykor)
Z = p['fun'](X,Y)
ax.plot_surface(X, Y, Z, color='pink', linewidth=0.6,edgecolors='k', shade=p['shading'])
ax.set_xticks([-4,0,4])
ax.set_yticks([-4,0,4])
if 'zticks' in p:
ax.set_zticks(p['zticks'])
ax.set_xlabel('x',fontsize=12)
ax.set_ylabel('y',fontsize=12)
ax.set_zlabel('z',fontsize=12, labelpad=0)
if ('elev' in p) and ('azim' in p):
ax.view_init(elev=p['elev'], azim=p['azim'])
else:
ax=fig.add_subplot(len(PLOHE),3,3*i+1+j)
if j == 1:
p = NIVO[i]
xkor = np.arange(*p['xkor'])
ykor = np.arange(*p['ykor'])
X, Y = np.meshgrid(xkor,ykor)
Z = p['fun'](X,Y)
contour = plt.contour(X, Y, Z, p['levels'], colors = 'k')
if 'manual_loc' in p:
ax.clabel(contour, colors = 'k', fmt = '%2.0f', fontsize=9, manual=p['manual_loc'])
else:
ax.clabel(contour, colors = 'k', fmt = '%2.0f', fontsize=9)
if ('xlim' in p) and ('ylim' in p):
ax.set(xlim=p['xlim'], ylim=p['ylim'], aspect=1)
else:
ax.set(xlim=[-5, 5], ylim=[-5, 5], aspect=1)
ax.set_xlabel('x',fontsize=12)
ax.set_ylabel('y',fontsize=12, rotation=0)
elif j == 2:
p = GRADIJENT[i]
xkor = np.arange(*p['xkor'])
ykor = np.arange(*p['ykor'])
X, Y = np.meshgrid(xkor,ykor)
dx = p['dx'](X,Y)
dy = p['dy'](X,Y)
plt.quiver(X,Y,dx,dy)
ax.set(xlim=[-5, 5], ylim=[-5, 5], aspect=1)
ax.set_xlabel('x',fontsize=12)
ax.set_ylabel('y',fontsize=12, rotation=0)