GaBuZoMeu a écrit:Peux tu décoder RMS ? Revue Militaire Suisse ? Reims Management School ? Richard M. Stallman ? République des Moluques du Sud ? Radio Morbihan Sud ? Root Mean Square ?
Tu veux minimiser la somme des carrés des distances aux droites ? Minimiser la plus grande distance aux droites ?
GaBuZoMeu a écrit:Peux tu décoder RMS ? Revue Militaire Suisse ? Reims Management School ? Richard M. Stallman ? République des Moluques du Sud ? Radio Morbihan Sud ? Root Mean Square ?
Tu veux minimiser la somme des carrés des distances aux droites ? Minimiser la plus grande distance aux droites ?
x,y,z=var('x,y,z')
Vars=[x,y,z]
# Calcul du carré de la distance du point [x,y,z]
# à une droite donnée comme le couple d'un point
# et d'un vecteur directeur
def cddroite(droite) :
point=vector(droite[0])
dir=vector(droite[1])
M=vector(Vars)
crossprod= (M-point).cross_product(dir)
return (crossprod.dot_product(crossprod))/(dir.dot_product(dir))
# Calcul de la somme des carrés des distances
# du point [x,y,z] aux droites d'une liste de droites
def scddroites(Droites) :
return add(cddroite(droite) for droite in Droites)
# Minimisation de la somme des carrés des distances
# Retourne le point ou le minimum est atteint et la
# racine carrée de la moyenne des carrés des distances
# depuis ce point
def Minscddroites(Droites) :
Somme=scddroites(Droites)
Jac=[diff(Somme,var) for var in Vars]
Crit=solve(Jac,Vars,solution_dict=True)[0]
MCD=(Somme.subs([var == Crit[var] for var in Vars]))/len(Droites)
return Crit, sqrt(MCD)
Minscddroites([[[2,3,4],[-1,2,1]],
[[0,0,0],[1,1,1]],
[[5,4,3],[2,1,0]],
[[1,3,1],[2,0,-1]]])
({z: 8879/3635, y: 9026/3635, x: 7187/3635}, 3*sqrt(1073/7270))
def Minscddroites(Droites) :
#calcul de la somme des carrés des distances
Somme=scddroites(Droites)
#liste des dérivées partielles / x,y,z
Jac=[diff(Somme,var) for var in Vars]
#résolution du système donné
#par les dérivées partielles
Crit=solve(Jac,Vars,solution_dict=True)[0]
MCD=(Somme.subs([var == Crit[var] for var in Vars]))/len(Droites)
return Crit, sqrt(MCD)
Minscddroites([[[2,3,4],[-1,2,1]],
[[0,0,0],[1,1,1]],
[[5,4,3],[2,1,0]],
[[1,3,1],[2,0,-1]]])
A = [
1.90000 -0.40000 0.23333
-0.40000 2.80000 -0.66667
0.23333 -0.66667 3.30000
]
et
B = [
3.3333
4.5333
6.8667
]
1;
M = [[[2,3,4],[-1,2,1]],
[[0,0,0],[1,1,1]],
[[5,4,3],[2,1,0]],
[[1,3,1],[2,0,-1]]];
for i = 1:4
M(i,4:end) = M(i,4:end)/norm(M(i,4:end));
end
function [A,B] = add(v)
A_i = v(1:3);
u = v(4:end);
a = u(1);
b = u(2);
c = u(3);
tmp = cross(u, A_i);
i = tmp(1);
j = tmp(2);
k = tmp(3);
A = [
[c^2+b^2, -a*b , -a*c],
[-a*b , a^2+c^2, -b*c],
[-a*c , -b*c , b^2+a^2]
];
B = [
j*c - k*b; a*k-i*c; i*b-a*j
];
endfunction
A = zeros(3,3);
B = zeros(3,1);
for i=1: 4
[A_i, B_i] = add(M(i,:));
A += A_i;
B += B_i;
end
X = inv(A)*B
function obj = phi (M,X)
obj = 0;
for i = 1:4
A = M(i,1:3)';
u = M(i,4:end)';
obj += sum(cross(u, X-A).^2);
end
endfunction
x0 = [-1.8; 1.7; 1.9];
[x, obj, info, iter, nf, lambda] = sqp (x0, @(X) phi(M,X));
x_sqp = x
% Coordonnées des points
x=[2 0;5 1];
y=[3 0;4 3];
z=[4 0;3 1];
% Vecteur directeur (x,y,z) sur la 3ème dimension
u=zeros(2,2,3);
u(:,:,1)=[-1 1;2 2];
u(:,:,2)=[2 1;1 0];
u(:,:,3)=[1 1;0 -1];
u=u./repmat(sqrt(sum(u.^2,3)),[1 1 3]); % Normalisation
%
Ayz=sum(sum(u(:,:,2).^2+u(:,:,3).^2));
Axy=sum(sum(u(:,:,1).^2+u(:,:,2).^2));
Axz=sum(sum(u(:,:,1).^2+u(:,:,3).^2));
Uxy=sum(sum(u(:,:,1).*u(:,:,2)));
Uxz=sum(sum(u(:,:,1).*u(:,:,3)));
Uyz=sum(sum(u(:,:,2).*u(:,:,3)));
Cx=sum(sum(x.*(u(:,:,2).^2+u(:,:,3).^2)-y.*u(:,:,1).*u(:,:,2)-z.*u(:,:,1).*u(:,:,3)));
Cy=sum(sum(y.*(u(:,:,1).^2+u(:,:,3).^2)-x.*u(:,:,2).*u(:,:,1)-z.*u(:,:,2).*u(:,:,3)));
Cz=sum(sum(z.*(u(:,:,1).^2+u(:,:,2).^2)-x.*u(:,:,3).*u(:,:,1)-y.*u(:,:,3).*u(:,:,2)));
A=[Ayz -Uxy -Uxz ; -Uxy Axz -Uyz ; -Uxz -Uyz Axy]
A =
1.9000 -0.4000 0.2333
-0.4000 2.8000 -0.6667
0.2333 -0.6667 3.3000
B=[Cx;Cy;Cz]
B =
3.3333
4.5333
6.8667
A\B
ans =
1.9772
2.4831
2.4426
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 113 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :