import platform
platform.platform()
platform.python_version()
import sympy as sp
sp.init_printing()
sp.__version__
x,y,z,t,u,v=sp.symbols('x y z t u v',real=True)
import matplotlib.pyplot as plt
%pylab inline
from mpl_toolkits.mplot3d import Axes3D
$f(x,y)=(x^2+y)\cos{\big(x^3y^2\big)}$
f=(x**2+y)*sp.cos(x**3*y**2)
f
Računanje vrijednosti funkcije u točki
f.evalf(subs={x:2,y:3})
$\dfrac{\partial f}{\partial x}$
f.diff(x)
sp.diff(f,x)
Ako je moguće, možemo faktorizirati izraz.
f.diff(x).factor()
$\dfrac{\partial f}{\partial y}$
f.diff(y)
sp.diff(f,y)
$\dfrac{\partial f}{\partial y}(2,3)$
fy=f.diff(y)
fy.evalf(subs={x:2,y:3})
$\dfrac{\partial^2 f}{\partial x^2}$
f.diff(x,2)
Možemo probati malo pojednostavniti izraz
f.diff(x,2).simplify()
f.diff(x,2).expand()
$\dfrac{\partial^2 f}{\partial y^2}$
f.diff(y,2)
Možemo se opet igrati s pojednostavljivanjem izraza
f.diff(y,2).expand()
f.diff(y,2).expand().factor()
$\dfrac{\partial^2 f}{\partial x\partial y}$
fxy=f.diff(x,1,y,1)
fxy
fxy.expand()
fxy.expand().factor()
hess_f=sp.hessian(f,[x,y])
hess_f
Hesseova matrica funkcije $f$ u točki $(2,3)$
mat23=hess_f.evalf(subs={x:2,y:3})
mat23
hess_f.det()
hess_f.det().simplify()
Hesseova determinanta u točki $(2,3)$
mat23.det()
$\dfrac{\partial^3 f}{\partial x^2\partial y}$
f_x2y=f.diff(x,2,y,1)
f_x2y
f_x2y=f_x2y.simplify()
f_x2y
$\dfrac{\partial^3 f}{\partial x^2\partial y}(2,3)$
f_x2y.evalf(subs={x:2,y:3})
na više znamenaka
f_x2y.evalf(n=30,subs={x:2,y:3})
$g(x,y,z)=x\log_2{\big(3x+z^4\big)}+5xyz$
g=x*sp.log(3*x+z**4,2)+5*x*y*z
g
g.diff(x)
g.diff(y)
g.diff(z)
$\dfrac{\partial g}{\partial x}(1,-2,2.14)$
g.diff(x).evalf(subs={x:1,y:-2,z:2.14})
$\dfrac{\partial^2 g}{\partial x\partial z}$
g.diff(x,1,z,1)
hess_g=sp.hessian(g,[x,y,z])
hess_g
Hesseova matrica funkcije $g$ u točki $(1,-2,2.14)$
hess_g.evalf(subs={x:1,y:-2,z:2.14})
hess_g.det()
g_det=hess_g.det().simplify()
g_det
Hesseova determinanta funkcije $g$ u točki $(1,-2,2.14)$
Možemo prvo odrediti općeniti izraz za Hesseovu determinantu pa uvrstiti konkretnu točku, ili možemo prvo uvrstiti točku da dobijemo Hesseovu matricu u konkretnoj točki pa računati determinantu s konkretnim brojevima.
g_det.evalf(subs={x:1,y:-2,z:2.14})
hess_g.evalf(subs={x:1,y:-2,z:2.14}).det()
$\dfrac{\partial^5 g}{\partial x^2\partial z^3}$
g_x2z3=g.diff(x,2,z,3)
g_x2z3
g_x2z3=g_x2z3.simplify()
g_x2z3
$\dfrac{\partial^5 g}{\partial x^2\partial z^3}(1,-2,2.14)$
g_x2z3.evalf(subs={x:1,y:-2,z:2.14})
$\dfrac{\partial^3 g}{\partial x\partial y\partial z}$
g.diff(x,1,y,1,z,1)
$\dfrac{\partial^4 g}{\partial x^2\partial y\partial z}$
g.diff(x,2,y,1,z,1)
$r_1(u)=\big(u^2,sin(u),u^3+\frac{1}{u}\big)$
r1=sp.Matrix([u**2,sp.sin(u),u**3+1/u])
r1
Derivacija vektorske funkcije jedne varijable
r1.diff(u)
Druga derivacija vektorske funkcije jedne varijable
r1.diff(u,2)
r1.diff(u,2).expand()
Treća derivacija vektorske funkcije jedne varijable
r1.diff(u,3)
r1.diff(u,3).expand()
$\dfrac{\mathrm{d}r_1}{\mathrm{d}u}(1)$
r1.diff(u).evalf(subs={u:1})
$\dfrac{\mathrm{d}r_1}{\mathrm{d}u}\times\dfrac{\mathrm{d}^2r_1}{\mathrm{d}u^2}$
r1_u=r1.diff(u)
r1_uu=r1.diff(u,2)
vek=r1_u.cross(r1_uu)
vek
$\dfrac{\mathrm{d}r_1}{\mathrm{d}u}(1)\times\dfrac{\mathrm{d}^2r_1}{\mathrm{d}u^2}(1)$
vek.evalf(subs={u:1})
Ili možemo prvi svaki vektor izračunati u točki $u=1$ pa vektorski produkt računati s konkretnim brojevima
vek1=r1.diff(u).evalf(subs={u:1})
vek2=r1.diff(u,2).evalf(subs={u:1})
vek1,vek2
vek1.cross(vek2)
$r_2(u,v)=\big(u\cos{v},u^2+3v\sin{v},v\sqrt{u}\big)$
r2=sp.Matrix([u*sp.cos(v),u**2+3*v*sp.sin(v),v*u**sp.Rational(1,2)])
r2
Parcijalne derivacije
r2.diff(u)
r2.diff(v)
Vrijednosti parcijalnih derivacija u točki $(1,-2)$
vek3=r2.diff(u).evalf(subs={u:1,v:-2})
vek3
vek4=r2.diff(v).evalf(subs={u:1,v:-2})
vek4
$\dfrac{\partial r_2}{\partial u}\times\dfrac{\partial r_2}{\partial v}$
r2u_x_r2v=r2.diff(u).cross(r2.diff(v))
r2u_x_r2v
$\dfrac{\partial r_2}{\partial u}(1,-2)\times\dfrac{\partial r_2}{\partial v}(1,-2)$
r2u_x_r2v.evalf(subs={u:1,v:-2})
Ili možemo prvi svaki vektor izračunati u točki $(1,-2)$ pa vektorski produkt računati s konkretnim brojevima
vek3.cross(vek4)
$\dfrac{\partial^3 r_2}{\partial u^2\partial v}$
r2.diff(u,2,v,1)
U nastavku dajemo rješenja nekoliko zadataka pomoću sympy modula. Također je dano nekoliko korisnih napomena kako bi se izbjeglo pogrešno korištenje sympy modula.
Pomoću diferencijala aproksimirajte prirast funkcije $F(x,y)=x^2y+y\sin{\big(x^2+y^2\big)}$ u točki $(1,-7)$ ako je $\Delta x=0.03,$ $\Delta y=-0.12$. Usporedite tu aproksimaciju sa stvarnim prirastom.
F=x**2*y+y*sp.sin(x**2+y**2)
F
Parcijalne derivacije funkcije $F$
Fx=F.diff(x)
Fy=F.diff(y)
Fx,Fy
Aproksimacija prirasta funkcije pomoću diferencijala
Fx0=Fx.evalf(subs={x:1,y:-7})
Fy0=Fy.evalf(subs={x:1,y:-7})
prirast_apr=Fx0*0.03+Fy0*(-0.12)
prirast_apr
Stvarna vrijednost prirasta
prirast=F.evalf(subs={x:1+0.03,y:-7-0.12}) - F.evalf(subs={x:1,y:-7})
prirast
plt.rcParams['figure.figsize'] = 12,9
sp.plotting.plot3d(F,(x,-10,10),(y,-10,10),xlabel='x',ylabel='y');
Sympy nudi brzo rješenje za crtanje ploha koje je bazirano na matplotlibu modulu. Prednost je da ne moramo pisati puno koda za dobivanje slike, a nedostatak je da nemamo puno slobode u kontroliranju izgleda slike. Ako želimo raditi više zahvata na samoj slici, onda je bolje da direktno koristimo matplotlib modul.
Namjerno je graf zumiran oko zadane točke $(1,-7)$ kako bismo vidjeli da moramo biti oprezni kod vizualizacije. Prethodna slika je nacrtana na puno većoj domeni i daje potpuno krivu predodžbu o izgledu same plohe jer dobivamo dojam da ploha nije uopće "brdovita". Donja slika daje vjerniji prikaz plohe. Stoga je uvijek bolje nacrtati plohu na manjoj domeni oko neke zadane točke jer ćemo na taj način dobiti vjerniju sliku kako ploha izgleda u blizini neke točke.
Također, na slici je prikazana početna točka na plohi $\big(1,-7,F(1,-7)\big)$ te plava krivulja po kojoj se krećemo iz te točke ako su pomaci $\Delta x=0.03,$ $\Delta y=-0.12$. Sada je jasnije zašto diferencijal u ovom slučaju ne daje tako dobru aproksimaciju stvarnog prirasta, iako pomaci od početne točke nisu pretjerano veliki.
#ploha
xkor = arange(0, 2, 0.05)
ykor = arange(-8, -6, 0.05)
X, Y = meshgrid(xkor,ykor)
Z = X**2*Y+Y*sin(X**2+Y**2)
#plava krivulja
tk = linspace(0, 0.25, 30)
xk = 1+tk
yk = -7-4*tk
zk = xk**2*yk+yk*sin(xk**2+yk**2)
#slika
figsize(12,9)
ax = axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap=cm.Spectral, linewidth=0.6,alpha=1,edgecolors='k')
ax.plot(xk, yk, zk, c='b',lw=4,alpha=0.7,zorder=3)
ax.plot([1], [-7], [F.evalf(subs={x:1,y:-7})], markerfacecolor='w', markeredgecolor='k',
marker='o', markersize=7, alpha=0.9,zorder=10)
ax.set_xlabel('\nx', linespacing=3.2,fontsize=16)
ax.set_ylabel('\ny', linespacing=3.2,fontsize=16)
ax.set_zlabel('z', linespacing=3.2,fontsize=16)
ax.view_init(elev=30,azim=-10)
ax.dist = 10
Odredite lokalne ekstreme funkcije $f(x,y)=\big(x^2-2y^2\big)\cdot2.415^{x-y}.$
Kako je sympy modul prvenstveno namijenjen za simbolički račun, broj $2.415$ je najbolje reprezentirani kao egzaktni racionalni broj. To je prvenstveno bitno kod rješavanja sustava jednadžbi da izbjegnemo probleme s numerikom.
f=(x**2-2*y**2)*sp.Rational(2415,1000)**(x-y)
f
fx=f.diff(x)
fx
fy=f.diff(y)
fy
stac=sp.solve([fx,fy],[x,y])
stac
stac1=stac[0]
stac2=stac[1]
stac1
Pretvorimo simboličke izraze kod druge stacionarne točke u realne brojeve.
stac2=tuple(map(lambda x: sp.N(x), stac2))
stac2
hess_f=sp.hessian(f,[x,y])
hess_f
Točka $(0,0)$ je sedlasta točka funkcije $f$.
H1=hess_f.evalf(subs={x:stac1[0],y:stac1[1]})
H1
H1.det()
U točki $(-4.53669415241996, -2.26834707620998)$ funkcija $f$ ima lokalni maksimum koji iznosi $1.39270791539802.$
H2=hess_f.evalf(subs={x:stac2[0],y:stac2[1]})
H2
H2.det()
f.evalf(subs={x:stac2[0],y:stac2[1]})
Na slici ne vidimo baš rezultate koje smo dobili računski.
sp.plotting.plot3d(f,(x,-5,1),(y,-3,1),xlabel='x',ylabel='y');
#ploha
xkor = arange(-5, 1, 0.07)
ykor = arange(-3, 1, 0.07)
X, Y = meshgrid(xkor,ykor)
Z = (X**2-2*Y**2)*2.415**(X-Y)
#slika
figsize(12,9)
ax = axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap=cm.Spectral, linewidth=0.6,alpha=1,edgecolors='k')
ax.plot([0,stac2[0]], [0,stac2[1]], [f.evalf(subs={x:0,y:0}),f.evalf(subs={x:stac2[0],y:stac2[1]})],
markerfacecolor='w', markeredgecolor='k', marker='o', ls='', markersize=7, alpha=0.9,zorder=10)
ax.set_xlabel('\nx', linespacing=3.2,fontsize=16)
ax.set_ylabel('\ny', linespacing=3.2,fontsize=16)
ax.set_zlabel('z', linespacing=3.2,fontsize=16)
ax.view_init(elev=30,azim=-50)
ax.dist = 10
Ako plohu dovoljno zumiramo oko točke $(0,0)$, možemo na slici uočiti da se radi o sedlastoj točki.
#ploha
xkor = arange(-1, 1, 0.07)
ykor = arange(-1, 1, 0.07)
X, Y = meshgrid(xkor,ykor)
Z = (X**2-2*Y**2)*2.415**(X-Y)
#slika
figsize(12,9)
ax = axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap=cm.Spectral, linewidth=0.6,alpha=1,edgecolors='k')
ax.plot([0], [0], [f.evalf(subs={x:0,y:0})], markerfacecolor='w', markeredgecolor='k',
marker='o', markersize=7, alpha=0.9,zorder=10)
ax.set_xlabel('\nx', linespacing=3.2,fontsize=16)
ax.set_ylabel('\ny', linespacing=3.2,fontsize=16)
ax.set_zlabel('z', linespacing=3.2,fontsize=16)
ax.view_init(elev=30,azim=-50)
ax.dist = 10
Ako plohu dovoljno zumiramo oko točke $(-4.53669415241996,-2.26834707620998)$, možemo na slici uočiti da se radi o točki lokalnog maksimuma.
#ploha
xkor = arange(-5, -4, 0.03)
ykor = arange(-2.5, -1.5, 0.03)
X, Y = meshgrid(xkor,ykor)
Z = (X**2-2*Y**2)*2.415**(X-Y)
#slika
figsize(12,9)
ax = axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap=cm.Spectral, linewidth=0.6,alpha=1,edgecolors='k')
ax.plot([stac2[0]], [stac2[1]], [f.evalf(subs={x:stac2[0],y:stac2[1]})],
markerfacecolor='w', markeredgecolor='k', marker='o', markersize=7, alpha=0.9,zorder=10)
ax.set_xlabel('\nx', linespacing=3.2,fontsize=16)
ax.set_ylabel('\ny', linespacing=3.2,fontsize=16)
ax.set_zlabel('z', linespacing=3.2,fontsize=16)
ax.view_init(elev=30,azim=-30)
ax.dist = 10
Odredite ekstreme funkcije $G(x,y,z)=(x-2)^2+(y-3)^2+(z+1.34)^2$ uz uvjet $\dfrac{x^2}{2}+\dfrac{y^2}{3}+\dfrac{z^2}{5.21}=1.$
G=(x-2)**2+(y-3)**2+(z+sp.Rational(134,100))**2
G
L=G + t*(sp.Rational(1,2)*x**2+sp.Rational(1,3)*y**2+sp.Rational(100,521)*z**2-1)
L
Lx=L.diff(x)
Lx
Ly=L.diff(y)
Ly
Lz=L.diff(z)
Lz
Lt=L.diff(t)
Lt
Nije moguće egzaktno riješiti zadani sustav jednadžbi pa trebamo ići na numeričko rješavanje da pronađemo približno rješenje.
sp.solve([Lx,Ly,Lz,Lt],[x,y,z,t])
Vidimo da iz prve tri jednadžbe možemo lagano nepoznanice $x,y,z$ izraziti pomoću nepoznanice $t$.
xt=sp.solve_linear(Lx,symbols=[x])
xt
yt=sp.solve_linear(Ly,symbols=[y])
yt
zt=sp.solve_linear(Lz,symbols=[z])
zt
Uvrstimo dobivene izraze u zadnju jednadžbu, tj. uvjet.
jed=Lt.subs({x:xt[1],y:yt[1],z:zt[1]})
jed
Malo sredimo jednadžbu tako da ju svedemo na traženje nultočaka polinoma.
jed.factor()
jed.factor().as_numer_denom()
Uzmemo samo brojnik.
jed=jed.factor().as_numer_denom()[0]
jed
Pretvorimo brojnik u klasu polinom i numerički pronađemo sve njegove nultočke.
jed=jed.as_poly()
jed
nultocke=jed.nroots()
nultocke
Zanimaju nas samo realna rješenja.
rj=list(filter(lambda x: sp.im(x)==0, nultocke))
rj
t1,t2=rj
t1
t2
Izračunamo pripadne vrijednosti nepoznanica $x,y,z.$
x1=xt[1].evalf(subs={t:t1})
x1
x2=xt[1].evalf(subs={t:t2})
x2
y1=yt[1].evalf(subs={t:t1})
y1
y2=yt[1].evalf(subs={t:t2})
y2
z1=zt[1].evalf(subs={t:t1})
z1
z2=zt[1].evalf(subs={t:t2})
z2
Kako je uvjet $\frac{x^2}{2}+\frac{y^2}{3}+\frac{z^2}{5.21}=1$ kompaktni skup u $\mathbb{R}^3$, funkcija $G$ u dobivenim dvjema stacionarnim točkama postiže globalne uvjetne ekstreme. Uvjet geometrijski predstavlja elipsoid u prostoru.
U točki $(-0.484941336090555,-1.24164983919808,1.38563269291597)$ funkcija $G$ postiže uvjetni globalni maksimum koji iznosi $31.595600378873.$
G.evalf(subs={x:x1,y:y1,z:z1})
U točki $(0.716171888898055,1.36669043281807,-0.793769243480183)$ funkcija $G$ postiže uvjetni globalni minimum koji iznosi $4.61428280047182.$
G.evalf(subs={x:x2,y:y2,z:z2})
Mogli smo sustav riješiti numerički direktno pomoću naredbe nsolve. Međutim, tada moramo navesti neku početnu aproksimaciju od pravog rješenja. Ukoliko je ta aproksimacija loša, možda nećemo uspjeti pronaći rješenje ili će dobiveno rješenje biti manje precizno. Pogledajte dolje nekoliko primjera izvođenja te naredbe s obzirom na različite početne aproksimacije. Prednost ovog načina je manje pisanja koda, a nedostatak je da moramo unaprijed znati koliko ima rješenja ukoliko ih želimo sva pronaći. Prednost ranijeg postupka jest da ne moramo unaprijed znati koliko imamo rješenja, nego korak po korak dolazimo do polinomijalne jednadžbe s jednom nepoznanicom čija rješenja možemo pronaći bez početnih aproksimacija. Nedostatak je da moramo pisati više koda, ali sigurno dolazimo do svih rješenja.
sp.nsolve([Lx,Ly,Lz,Lt],[x,y,z,t],[-3,5,1,-9])
sp.nsolve([Lx,Ly,Lz,Lt],[x,y,z,t],[1,2,-1,4])
sp.nsolve([Lx,Ly,Lz,Lt],[x,y,z,t],[20,13,30,100])
sp.nsolve([Lx,Ly,Lz,Lt],[x,y,z,t],[200,103,300,100])
sp.nsolve([Lx,Ly,Lz,Lt],[x,y,z,t],[200,103,300,100],verify=False)
Funkcija $G$ zapravo daje kvadrat udaljenosti točke $(2,3,-1.34)$ od točke $(x,y,z)$. U zadatku se zapravo traže na elipsoidu $\frac{x^2}{2}+\frac{y^2}{3}+\frac{z^2}{5.21}=1$ najbliža i najudaljenija točka od točke $(2,3,-1.34).$
Točka $(-0.484941336090555,-1.24164983919808,1.38563269291597)$ je najudaljenija točka na zadanom elipsoidu od točke $(2,3,-1.34)$ i njihova udaljenost iznosi $5.62099638666251.$
d1=G.evalf(subs={x:x1,y:y1,z:z1})
sp.sqrt(d1)
Točka $(0.716171888898055,1.36669043281807,-0.793769243480183)$ je najbliža točka na zadanom elipsoidu od točke $(2,3,-1.34)$ i njihova udaljenost iznosi $2.14808817334667.$
d2=G.evalf(subs={x:x2,y:y2,z:z2})
sp.sqrt(d2)
#ploha
uk = linspace(0, 2*pi, 80)
vk = linspace(0, pi, 60)
xk, yk = meshgrid(uk,vk)
X = 2*cos(xk)*sin(yk)
Y = 3*sin(uk)*sin(yk)
Z = 5.21*cos(yk)
#slika
figsize(12,9)
ax = axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap=cm.Spectral, linewidth=0.3,alpha=0.5,edgecolors=(0,0,0,0.3))
ax.plot([0.97,2], [1.25,3], [-0.21,-1], marker='', alpha=1, c='k',zorder=3)
ax.plot([2,2], [3,3], [-1,-5.2], marker='', alpha=1, c='k',ls='--',lw=1,zorder=3)
ax.plot([0.97,x1], [1.25,y1], [-0.21,z1], marker='', alpha=1, c='k')
ax.plot([2,x2], [3,y2], [-1,z2], marker='', alpha=1, c='k',zorder=3)
ax.plot([x1], [y1], [z1], markerfacecolor='b', markeredgecolor='b',
marker='o', markersize=7, alpha=1)
ax.plot([2], [3], [-1.34], markerfacecolor='w', markeredgecolor='r',
marker='o', markersize=8, alpha=1,zorder=10)
ax.plot([x2], [y2], [z2], markerfacecolor='b', markeredgecolor='b',
marker='o', markersize=7, alpha=0.7, zorder=10)
ax.set_xlabel('\nx', linespacing=3.2,fontsize=16)
ax.set_ylabel('\ny', linespacing=3.2,fontsize=16)
ax.set_zlabel('z', linespacing=3.2,fontsize=16)
ax.set_zlim3d(-5,5)
ax.view_init(elev=30,azim=60)
ax.dist = 10
Odredite ekstreme funkcije $f(x,y)=2x+3y$ uz uvjet $xy=2.$
f=2*x+3*y
f
L=f+t*(x*y-2)
L
Lx=L.diff(x)
Lx
Ly=L.diff(y)
Ly
Lt=L.diff(t)
Lt
stac=sp.solve([Lx,Ly,Lt],[x,y,t])
stac
hess_L=sp.hessian(L,[t,x,y])
hess_L
U točki $\Big(\!-\!\sqrt{3},-\frac{2}{3}\sqrt{3}\Big)$ funkcija $f$ postiže uvjetni lokalni maksimum koji iznosi $-4\sqrt{3}.$
hess_L.evalf(subs={x:stac[0][0],y:stac[0][1],t:stac[0][2]})
H1=hess_L.subs({x:stac[0][0],y:stac[0][1],t:stac[0][2]})
H1
H1.det()
f.subs({x:stac[0][0],y:stac[0][1]})
f1=f.evalf(subs={x:stac[0][0],y:stac[0][1]})
f1
U točki $\Big(\sqrt{3},\frac{2}{3}\sqrt{3}\Big)$ funkcija $f$ postiže uvjetni lokalni minimum koji iznosi $4\sqrt{3}.$
hess_L.evalf(subs={x:stac[1][0],y:stac[1][1],t:stac[1][2]})
H2=hess_L.subs({x:stac[1][0],y:stac[1][1],t:stac[1][2]})
H2
H2.det()
f.subs({x:stac[1][0],y:stac[1][1]})
f2=f.evalf(subs={x:stac[1][0],y:stac[1][1]})
f2
#ploha
xkor = arange(-10, 10, 1)
ykor = arange(-10,10,1)
X, Y = meshgrid(xkor,ykor)
Z = 2*X+3*Y
#crvena i plava krivulja
tk1 = linspace(0.23, 9, 40)
yk1 = 2 / tk1
zk1 = 2*tk1 + 3*yk1
tk2 = linspace(-10,-0.2, 40)
yk2 = 2 / tk2
zk2 = 2*tk2 + 3*yk2
#slika
figsize(12,9)
ax = axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap=cm.summer, linewidth=0.6,alpha=0.8,edgecolors=(0,0,0,0.4))
ax.plot(tk1, yk1, zk1, c='r',lw=3,alpha=0.7,zorder=3)
ax.plot(tk2, yk2, zk2, c='r',lw=3,alpha=0.7,zorder=3)
ax.plot(tk1, yk1, -50, c='b',lw=3,alpha=0.9)
ax.plot(tk2, yk2, -50, c='b',lw=3,alpha=0.9)
ax.plot([stac[0][0],stac[1][0],stac[0][0],stac[1][0]], [stac[0][1],stac[1][1],stac[0][1],stac[1][1]], [f1,f2,-50,-50],
markerfacecolor='w', markeredgecolor='k', ls='', marker='o', markersize=7, alpha=0.9,zorder=10)
ax.set_xlabel('\nx', linespacing=3.2,fontsize=16)
ax.set_ylabel('\ny', linespacing=3.2,fontsize=16)
ax.set_zlabel('z', linespacing=3.2,fontsize=16)
ax.set_zlim3d(-50,50)
ax.view_init(elev=20,azim=-70)
ax.dist = 10
Zadana je ploha $r(u,v)=\big(\sin{u},\,\sin{v},\,\sin{(u+v)}\big)$ i točka $A$ na toj plohi s parametrima $u=1.25$, $v=1.35$. Odredite jednadžbu tangencijalne ravnine na zadanu plohu u točki $A$.
r=sp.Matrix([sp.sin(u),sp.sin(v),sp.sin(u+v)])
r
ru=r.diff(u)
ru
rv=r.diff(v)
rv
Vektori koji određuju tangencijalnu ravninu u točki plohe s parametrima $u=1.25,$ $v=1.35$
v1=ru.subs({u:1.25,v:1.35})
v1
v2=rv.subs({u:1.25,v:1.35})
v2
ruxrv=ru.cross(rv)
ruxrv
Normala tangencijalne ravnine u točki plohe s parametrima $u=1.25,$ $v=1.35$
nor=ruxrv.subs({u:1.25,v:1.35})
nor
A=r.subs({u:1.25,v:1.35})
A
rav=sp.Plane(sp.Point3D(A),nor)
rav.equation()
rav.equation().evalf()
#ploha
uk = linspace(0, 2*pi, 100)
vk = linspace(0, 2*pi, 100)
xk, yk = meshgrid(uk,vk)
X = sin(xk)
Y = sin(yk)
Z = sin(xk+yk)
#tangencijalna ravnina
alpha=0.8
u1 = linspace(-0.6,0.6,2)
u2 = linspace(-1.6,1.6,2)
xr,yr = meshgrid(u1,u2)
xrav = float(A[0])+float(v1[0])*(xr*cos(alpha)-sin(alpha)*yr)+float(v2[0])*(yr*cos(alpha)+sin(alpha)*xr)
yrav = float(A[1])+float(v1[1])*(xr*cos(alpha)-sin(alpha)*yr)+float(v2[1])*(yr*cos(alpha)+sin(alpha)*xr)
zrav = float(A[2])+float(v1[2])*(xr*cos(alpha)-sin(alpha)*yr)+float(v2[2])*(yr*cos(alpha)+sin(alpha)*xr)
#slika
figsize(12,9)
ax = axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap=cm.Spectral, linewidth=0.3,alpha=0.9,edgecolors=(0,0,0,0.3))
ax.plot_surface(xrav, yrav, zrav, cmap=cm.gray, linewidth=0.1,alpha=0.4,edgecolors=(0,0,0,0.2))
ax.plot([A[0]], [A[1]], [A[2]], markerfacecolor='w', markeredgecolor='b',
marker='o', markersize=7, alpha=1,zorder=10)
ax.set_xlabel('\nx', linespacing=3.2,fontsize=16)
ax.set_ylabel('\ny', linespacing=3.2,fontsize=16)
ax.set_zlabel('z', linespacing=3.2,fontsize=16)
ax.view_init(elev=30,azim=60)
ax.dist = 10