F-X. Dehon - dehon[@]unice.fr - 7 avr 2020
Utilité sous les contraintes , et .
On dessine :
On visualise ainsi
r=20;u=42
x,y,z = var('x,y,z')
xmax,ymax,zmax=(8,8,80)
b(x,y)=r-(5*x+3*y) #contrainte revenu - prix
U(x,y)=(x+2)*(x+3*y) #utilité
A=line3d([(0,0,0),(xmax,0,0),(0,0,0)])+line3d([(0,0,0),(0,ymax,0),(0,0,0)])+line3d([(0,0,0),(0,0,zmax),(0,0,0)])#bug avec line3d et threejs
T=text3d(' x ', (xmax/2, -.5, -.5))+text3d(' y ', (-.5, ymax/2, -.5))+text3d(' z ', (-.5, -.5,zmax/2))+text3d('0',(-.5, -.5,-.5))+text3d(str(xmax),(xmax, -.5,-.5))+text3d(str(ymax),(-.5,ymax,-.5))+text3d(str(zmax),(-.5,-.5,zmax))
B=implicit_plot3d(b,(x,0,r/5),(y,0,r/3),(z,0,zmax),color='green', opacity=0.8)
I=implicit_plot3d(z==u,(x,0,xmax),(y,0,ymax),(z,0,zmax),color='lightblue', opacity=0.5)+text3d('z='+str(u),(-.5,-.5,u))
P = implicit_plot3d(z-U(x,y),(x,0,xmax),(y,0,ymax),(z,0,zmax),color='orange', opacity=0.7)#,region=b
show(P+B+A+T+I,frame=false,aspect_ratio=[1,1,.1],viewer='threejs')
JJ=contour_plot(U(x,y),(x,0,xmax),(y,0,ymax),contours=15,fill=False,labels=True,label_inline=False)
show(JJ)
Courbe d'indifférence (en orange), région en vert, ème du gradiant de en où :
var('y')
x0=2;y0=solve(U(x0,y)==42,y)[0].rhs()
print y0, U(x0,y0)
var('x,y')
R=region_plot([b(x,y)>=0,x>=0,y>=0],(x,-.1,xmax),(y,-.1,ymax),incol='lightgreen',bordercol='green')+implicit_plot(U(x,y)==u,(x,0,xmax),(y,0,ymax),color='orange')
G=arrow((x0,y0),vector((x0,y0))+1/10*U.gradient()(x0,y0),color='orange')
show(R+G,aspect_ratio=1)
N=implicit_plot(U(x,y)==u,(x,0,xmax),(y,0,ymax)).matplotlib().get_children()[1].collections[0].get_paths()[0].to_polygons(closed_only=False)[0]
N3d=line3d([[p[0],p[1],u] for p in N],color='red')+text3d('z='+str(u),(-.5,-.5,u))
N3d0=line3d([[p[0],p[1],0] for p in N],color='black')
show(P+B+A+T+I+N3d+N3d0+line3d([[r/5,0,0],[0,r/3,0],[r/5,0,0]],color='black'),frame=false,aspect_ratio=[1,1,.1],viewer='threejs')
N3d=[[p[0],p[1],u] for p in N]#;print N3d
show(line3d(N3d,color='black'),aspect_ratio=[1,1,.1],viewer='threejs')
#I=implicit_plot3d((z-1)^2+(x-1)^2,(x,0,xmax),(y,0,ymax),(z,0,zmax),color='black')#n'est pas dessiné
#I=implicit_plot(U(x,y)==u,(x,0,xmax),(y,0,ymax),color='black').plot3d()#produit une erreur
#NN=line2d(N,color='black').plot3d(u)+text3d('z='+str(u),(-.5,-.5,u))