Minimum odleglosci

1476 days ago by Henryk

# zadanie, które studenci zaproponowali na konsultacjach # okazało się, że istotnie jest to zadanie zaproponowane przez pana Borodzika, # a ponadto, że nie bardzo możemy w nim oczekiwać ładnych wyników # polecenie: znajdź odległość między powierzchnią P1 zadaną rówananiem x+y+z=10 i # powierzchnią P2 zadaną równaniem x^2+y^4+z^6 = 1 y1,y2,z1,z2,x,y,z = var('y1 y2 z1 z2 x y z') # minimum funkcji f to czwórka punktów (y1,y2,z1,z2) minimalizujących odległość między P1 i P2 # wielkości x1,x2 możemy wyliczyć, bo są zależne od (y1,y2,z1,z2) f(y1,y2,z1,z2) = (y1-y2)^2+(z1-z2)^2+((10-y1-z1)-(1-y2^4-z2^6)^0.5)^2 # poniższe dwie komendy generują wykres P1 = implicit_plot3d(x+y+z-10, (x,-5, 5), (y,-5, 5), (z,-5, 5)) P2 = implicit_plot3d(x^2 + y^4 + z^6 - 1, (x,-5, 5), (y,-5, 5), (z,-5, 5)) P1+P2 
       
# minimalizujemy funkcję odległości metodami numerycznymi, żeby # zorientować się, gdzie faktycznie jest rozwiązanie minimize(f,[0.5,0.5,0.5,0.5],algorithm="ncg",disp=0) 
       
(3.31330039799, 0.717953745002, 3.35120357527, 0.755856975581)
# domniemana odpowiedź to print "Odległość między P1 i P2 wynosi "+str(math.sqrt(f(3.31330039799, 0.717953745002, 3.35120357527, 0.755856975581))) # spróbujemy potwierdzić ten wynik metodami nieco bardziej geometrycznymi x1,x2,t=var('x1 x2 t') F(x,y,z)=x+y+z G(x,y,z)=x^2+y^4+z^6 # poniżej wyświetlą się gradienty F i G, czyli wektore prostopadłe do płaszczyzn stycznych do powierzchni P1 i P2 print "Gradient do powierzchni P1 to "+str(F.diff()) print "Gradient do powierzchni P2 to "+str(G.diff()) 
       
Odległość między P1 i P2 wynosi 4.4952722239
Gradient do powierzchni P1 to (x, y, z) |--> (1, 1, 1)
Gradient do powierzchni P2 to (x, y, z) |--> (2*x, 4*y^3, 6*z^5)
# szukamy punktu na powierzchni P2, na której wektor prostopadły do płaszczyzny stycznej zgadza się # z wektorem prostopadłym do powierzchni P1, czyli z wektorem (1,1,1) solve([t==2*x,t==4*y^3,t==6*z^5,G(x,y,z)==1],[x,y,z,t]) 
       
[[x == (0.983900830264 - 0.318948845654*I), y == (-0.326643599588 +
0.73320598495*I), z == (0.297406918802 + 0.751462861336*I), t ==
(1.96780166053 - 0.637897691307*I)], [x == (0.983900830264 +
0.318948845654*I), y == (-0.326643599588 - 0.73320598495*I), z ==
(0.297406918802 - 0.751462861336*I), t == (1.96780166053 +
0.637897691307*I)], [x == (-0.793079392896 - 0.0886227106284*I), y
== (-0.735690136313 - 0.0273025579299*I), z == (-0.253297872042 +
0.724309504962*I), t == (-1.58615878579 - 0.177245421257*I)], [x ==
(-0.793079392896 + 0.0886227106284*I), y == (-0.735690136313 +
0.0273025579299*I), z == (-0.253297872042 - 0.724309504962*I), t ==
(-1.58615878579 + 0.177245421257*I)], [x == (-0.983900830264 -
0.318948845654*I), y == (0.326643599588 + 0.73320598495*I), z ==
(-0.297406918802 + 0.751462861336*I), t == (-1.96780166053 -
0.637897691307*I)], [x == (-0.983900830264 + 0.318948845654*I), y ==
(0.326643599588 - 0.73320598495*I), z == (-0.297406918802 -
0.751462861336*I), t == (-1.96780166053 + 0.637897691307*I)], [x ==
(0.793079392896 - 0.0886227106284*I), y == (0.735690136313 -
0.0273025579299*I), z == (0.253297872042 + 0.724309504962*I), t ==
(1.58615878579 - 0.177245421257*I)], [x == (0.793079392896 +
0.0886227106285*I), y == (0.735690136313 + 0.0273025579299*I), z ==
(0.253297872042 - 0.724309504962*I), t == (1.58615878579 +
0.177245421257*I)], [x == (1.05828951559 + 0.0504028554173*I), y ==
(-0.393402015674 - 0.707062835805*I), z == (0.243581960132 +
0.774680781874*I), t == (2.11657903118 + 0.100805710835*I)], [x ==
(1.05828951559 - 0.0504028554173*I), y == (-0.393402015674 +
0.707062835805*I), z == (0.243581960132 - 0.774680781874*I), t ==
(2.11657903118 - 0.100805710835*I)], [x == (0.913647520272 -
0.0676198564713*I), y == (0.770631224553 - 0.0189809358666*I), z ==
(-0.631235384212 + 0.473024898693*I), t == (1.82729504055 -
0.135239712945*I)], [x == (0.913647520272 + 0.0676198564713*I), y ==
(0.770631224553 + 0.0189809358666*I), z == (-0.631235384212 -
0.473024898693*I), t == (1.82729504055 + 0.135239712945*I)], [x ==
(-1.05828951559 + 0.0504028554173*I), y == (0.393402015674 -
0.707062835805*I), z == (-0.243581960132 + 0.774680781874*I), t ==
(-2.11657903118 + 0.100805710835*I)], [x == (-1.05828951559 -
0.0504028554173*I), y == (0.393402015674 + 0.707062835805*I), z ==
(-0.243581960132 - 0.774680781874*I), t == (-2.11657903118 -
0.100805710835*I)], [x == 0.740149456522, y == 0.71795374363, z ==
0.755856966708, t == 1.48029891304], [x == (-0.91364752027 -
0.0676198564699*I), y == (-0.770631224553 - 0.0189809358663*I), z ==
(0.631235384212 + 0.473024898693*I), t == (-1.82729504055 -
0.135239712946*I)], [x == (-0.91364752027 + 0.0676198564699*I), y ==
(-0.770631224553 + 0.0189809358663*I), z == (0.631235384212 -
0.473024898693*I), t == (-1.82729504055 + 0.135239712946*I)], [x ==
-0.740149456522, y == -0.71795374363, z == -0.755856966708, t ==
-1.48029891304], [x == (-1.17787804881 - 0.337302879177*I), y ==
(0.354536440426 + 0.771761705512*I), z == (0.647909336306 +
0.528346086604*I), t == (-2.35575609762 - 0.674605758358*I)], [x ==
(-1.17787804881 + 0.337302879177*I), y == (0.354536440426 -
0.771761705512*I), z == (0.647909336306 - 0.528346086604*I), t ==
(-2.35575609762 + 0.674605758358*I)], [x == (1.2319041929 +
0.131464694307*I), y == (-0.399800675711 - 0.752880810139*I), z ==
(-0.688178721723 + 0.477971266307*I), t == (2.46380838581 +
0.262929388611*I)], [x == (1.2319041929 - 0.131464694307*I), y ==
(-0.399800675711 + 0.752880810139*I), z == (-0.688178721723 -
0.477971266307*I), t == (2.46380838581 - 0.262929388611*I)], [x ==
(1.17787804881 - 0.337302879179*I), y == (-0.354536440426 +
0.771761705513*I), z == (-0.647909336306 + 0.528346086604*I), t ==
(2.35575609762 - 0.674605758359*I)], [x == (1.17787804881 +
0.337302879179*I), y == (-0.354536440426 - 0.771761705513*I), z ==
(-0.647909336306 - 0.528346086604*I), t == (2.35575609762 +
0.674605758359*I)], [x == (-1.2319041929 + 0.131464694309*I), y ==
(0.39980067571 - 0.752880810139*I), z == (0.688178721723 +
0.477971266307*I), t == (-2.46380838581 + 0.262929388611*I)], [x ==
(-1.2319041929 - 0.131464694309*I), y == (0.39980067571 +
0.752880810139*I), z == (0.688178721723 - 0.477971266307*I), t ==
(-2.46380838581 - 0.262929388611*I)], [x == (-0.941912410325 +
0.162348406133*I), y == (0.351781057515 - 0.698218301655*I), z ==
(-0.795053168392 + 0.0271510174461*I), t == (-1.88382482067 +
0.324696812262*I)], [x == (-0.941912410325 - 0.162348406133*I), y ==
(0.351781057515 + 0.698218301655*I), z == (-0.795053168392 -
0.0271510174461*I), t == (-1.88382482067 - 0.324696812262*I)], [x ==
(0.941912410337 + 0.162348406132*I), y == (-0.351781057518 -
0.698218301658*I), z == (0.795053168393 + 0.0271510174464*I), t ==
(1.88382482067 + 0.324696812267*I)], [x == (0.941912410337 -
0.162348406132*I), y == (-0.351781057518 + 0.698218301658*I), z ==
(0.795053168393 - 0.0271510174464*I), t == (1.88382482067 -
0.324696812267*I)]]
# zadanie dodatkowe (na spostrzegawczość): na powyższej liście znajdź dwa rozwiązania rzeczywiste # po chwili orientujemy się, że chodzi o # [x == 0.740149456522, y == 0.71795374363, z == 0.755856966708, t == 1.48029891304] # [x == -0.740149456522, y == -0.71795374363, z == -0.755856966708, t == -1.48029891304] 
       
# widzimy zatem, że na powierzchni P2 są dwaj kandydaci do minimalizowania odległości do P1; # aby wybrać jednego z nich zbadamy, o ile trzeba przesunąć punkt (x,y,z) wyliczony powyżej, aby znaleźć się na # powierzchni P1; oczywiście będziemy przesuwać o wektor prostopadły do powierzchni, czyli o wektor (1,1,1) s = var('s') solve(F(0.740149456522+s,0.71795374363+s,0.755856966708+s)==10,s) 
       
[s == (27329/10530)]
# zatem odpowiedź wynosi dla tego punktu 27329/10530 * math.sqrt(3) 
       
4.4952722241262899
# co można uznać za dostatecznie doskonałe przybliżenie uprzednio uzyskanej odpowiedzi # sprawdźmy jeszcze przypadek drugiego punktu, czyli solve(F(-0.740149456522+s,-0.71795374363+s,-0.755856966708+s)==10,s) 
       
[s == (42871/10530)]
# zatem odpowiedź wynosi dla tego punktu 42871/10530 * math.sqrt(3) 
       
7.0517331596662229
# widzimy, że pierwszy z powyższych punktów realizuje minimum