# Zadanie 4
    
var('x,y,z,a,b,wartosc')
    
f=x+2*z
g=x^2+y^2+z^2-5;
h=x^2-y^2-1;
    
fx=diff(f,x); #pochodne cząstkowe f
fy=diff(f,y); 
fz=diff(f,z);
    
print 'grad(f)=',[fx,fy,fz];
    
gx=diff(g,x) #pochodne cząstkowe więzow g
gy=diff(g,y) 
gz=diff(g,z) 
    
print 'grad(g)=',[gx,gy,gz]
    
hx=diff(h,x) #pochodne cząstkowe g2
hy=diff(h,y) 
hz=diff(h,z) 
    
print 'grad(h)=',[hx,hy,hz]
    
rownania1=[f==wartosc,g==0,h==0, 
a*gx+b*hx==fx,
a*gy+b*hy==fy,
a*gz+b*hz==fz]
   
print 'UKŁAD RÓWNAŃ'
print rownania1

rozwiazania1=solve(rownania1,wartosc,x,y,z,a,b)

print 'ROZWIĄZANIA'
print rozwiazania1

print 'Trzeba jeszcze znaleźć punkty zbioru {g=h=0}'
print 'w których grad(g) i grad(h) są liniowo zależne.'
print 'Ponieważ grad(g) nie zeruje się na zbiorze {g=0}'
print 'sprawdzamy tylko warunek grad(h)=a*grad(g)'

rownania2=[f==wartosc, g==0,h==0,
a*hx==gx,
a*hy==gy,
a*hz==gz]
rozwiazania2=solve(rownania2,wartosc,x,y,z,a)
print rozwiazania2
if rozwiazania2==[ ]: print 'W tym zadaniu nie ma takich punktów.'

wartosci=[wartosc.subs_expr(rozwiazanie[0]) for rozwiazanie in rozwiazania1+rozwiazania2]

print 'WARTOSCI'
print wartosci
print 'MAKSIMUM', max(wartosci)
print 'MINIMUM', min(wartosci)