Plan de montage à 4 (ou plus) points XYZ
J'ai 4 points, qui sont très près d'être à la une de l'avion c'est le 1,4-Dihydropyridine cycle.
J'ai besoin de calculer la distance à partir de C3 et N1 à l'avion, qui est constitué de C1-C2-C4-C5.
Calcul de la distance est OK, mais côté d'avion est assez difficile pour moi.
1,4-DHP cycle http://i.stack.imgur.com/dhNDo.png
1,4-DHP cycle, un autre point de vue http://i.stack.imgur.com/6Xs0z.png
from array import *
from numpy import *
from scipy import *
# coordinates (XYZ) of C1, C2, C4 and C5
x = [0.274791784, -1.001679346, -1.851320839, 0.365840754]
y = [-1.155674199, -1.215133985, 0.053119249, 1.162878076]
z = [1.216239624, 0.764265677, 0.956099579, 1.198231236]
# plane equation Ax + By + Cz = D
# non-fitted plane
abcd = [0.506645455682, -0.185724560275, -1.43998120646, 1.37626378129]
# creating distance variable
distance = zeros(4, float)
# calculating distance from point to plane
for i in range(4):
distance[i] = (x[i]*abcd[0]+y[i]*abcd[1]+z[i]*abcd[2]+abcd[3])/sqrt(abcd[0]**2 + abcd[1]**2 + abcd[2]**2)
print distance
# calculating squares
squares = distance**2
print squares
Comment faire de la somme(carrés) minimisé? J'ai essayé la méthode des moindres carrés, mais il est encore trop a eu pour moi.
- Essayez de demander sur les mathématiques.stackexchange? Vous ne semblez pas avoir besoin de codage à l'aide de l'atm 🙂
- Je ne suis pas sûr de mentionner "le 1,4-Dihydropyridine cycle" aide dans ce cas. Avez-vous googlé "plan de montage python" ? Le cinquième résultat est prometteur...
- J'ai écrit une réponse similaire here qui peut être utile (ignorer la toute dernière partie sur le poids)
- L'information liée par @MrE est cruciale pour la compréhension de ce que ma solution n'derrière les coulisses. Sinon vous êtes tout simplement traitant avec de la magie de la boîte noire.
- Oui! Le plus difficile est de comprendre comment la distance est calculée.
- Vous supposez que votre Google bulle est le même que le lecteur de Google bulle, plus que les bulles restent statiques dans le temps. Elle n'est pas vraie. Un lien est plus utile qu'un vague "Vous devriez google "ceci" et cliquez sur le n-ième résultat." Juste pour prouver mon point, qui est actuellement le premier résultat d'une recherche sur DuckDuckGo est précisément à cette question sur StackOverflow.
Vous devez vous connecter pour publier un commentaire.
Le fait que vous êtes à côté d'un avion est peu pertinent ici. Ce que vous essayez de faire est de minimiser une particulier fonction à partir d'une supposition. Pour que l'utilisation
scipy.optimize
. Notez qu'il n'y a aucune garantie que cela est le globalement optimale solution, seulement localement optimale. Une autre condition initiale peut converger vers un résultat différent, cela fonctionne bien si vous commencez à fermer les minima locaux, vous êtes à la recherche d'.J'ai pris la liberté de nettoyer votre code en profitant de numpy de radiodiffusion:
Cela donne:
Que les sons sur la droite, mais vous devez remplacer l'optimisation non linéaire avec un SVD. L'exemple suivant crée le moment de tenseur d'inertie, M, et puis SVD est elle pour obtenir la normale au plan. Cela devrait être une approximation de la méthode des moindres carrés ajustement et d'être beaucoup plus rapide et plus prévisible. Il renvoie le point-cloud centre et de la normale.
Par exemple: Construire une 2D nuage à (10, 100), qui est mince dans la direction x et 100 fois plus grande dans la direction y:
L'ajustement de l'avion est très près de à (10, 100) avec une normale de très près le long de l'axe des x.
scipy.optimize.leastsq
est grande, mais (en supposant que je n'ai pas l'ajout d'un bug), c'est la bonne Façon de faire des moindres carrés. en.wikipedia.org/wiki/Total_least_squaresDes moindres carrés doivent s'adapter à un avion facilement. L'équation d'un plan est: ax + by + c = z. Donc, mettre en place des matrices comme ça avec toutes vos données:
Et
Et
En d'autres termes: Ax = B. Maintenant résoudre pour x qui sont vos coefficients. Mais puisque vous avez plus de 3 points, le système est sur-déterminé de sorte que vous devez utiliser la gauche pseudo-inverse. Donc la réponse est:
Et ici est un simple code Python avec un exemple:
La solution pour vos points:
Voici un moyen. Si vos points sont P[1]..P[n] ensuite, on calcule la moyenne M de la ces et de la soustraire de chaque, gagner des points p[1]..p[n]. Ensuite, on calcule C = Sum{ p[i]*p[i]'} (la "covariance" matrice de points). Prochaine diagonaliser C, qui est de trouver orthogonale de U et de la diagonale de E, de sorte que C = U*E*U'. Si vos points sont en effet dans un avion, alors l'une des valeurs propres (c'est à dire la diagonale des entrées de E) sera très faible (avec une parfaite arithmétique, il serait 0). Dans tous les cas, si le j-ième de l'un de ces est la plus petite, puis de laisser le j-ième colonne de U (A,B,C) et calculer D = -M'*N. Ces paramètres définissent le "meilleur" plan, celui que la somme des carrés des distances à partir de la P[] à l'avion est moins.
Un autre moyen, hormis la svd d'atteindre rapidement une solution tout en traitant avec des valeurs aberrantes ( lorsque vous avez un grand ensemble de données ) est ransac :