Explication du problème: j'ai des points avec des coordonnées (x, y, z) à deux + moments distincts. Pour plus de commodité, ils peuvent être imaginés comme des points irrégulièrement espacés le long de la surface d'un paraboloïde inversé. Le paraboloïde présente une épaisseur minimale. Le paraboloïde change légèrement de forme avec le temps (comme un ballon qui se gonfle) et quand il le fait, tous les points bougent. En soustrayant les coordonnées à time2 - time1, je peux obtenir les vecteurs de déplacement à chaque point.
Il est important de noter (et je soupçonne que cela pourrait être la source du problème) qu'au premier point dans le temps, les coordonnées x et y vont de 0 à 2000, et les coordonnées z sont toutes dans une plage plus étroite - disons 350 à 450. Lors de la déformation, chaque point a une composante x de déplacement, une composante y et une composante z. Les composantes x et y sont petites (~ 50 au plus), tandis que la composante z est la plus grande (va jusqu'à 400 près du centre, beaucoup moins près des bords).
En utilisant les moindres carrés mobiles pondérés à l'emplacement de chaque point, j'essaie d'ajuster les composantes des déplacements à une surface polynomiale du deuxième degré en fonction des coordonnées x, y, z d'origine du point: par exemple. x composante de
displacement = ax^2 + bxy + cx + dy^2.. + hz^2 + iz + j
J'utilise la lsqr
fonction dans MATLAB, comme ça, en boucle sur chaque point pour chaque intervalle de temps:
Ux = displacements{k,1}(:,1);
Cx = lsqr((adjust_B_matrix'*W*adjust_B_matrix),(adjust_B_matrix'*W*Ux),1e-7,10000);
W
est la matrice de poids, et adjust_B_matrix
est la matrice de toutes les coordonnées (x, y, z) au temps 1, décalées de sorte qu'elles soient toutes centrées autour du point auquel j'essaie d'adapter la fonction.
Qu'est-ce qui ne va pas? Cela ne fonctionne tout simplement pas - une fois que j'ai les fonctions, elles sont recentrées autour des coordonnées réelles des points. Mais une fois que j'ai tracé les points résultants (pointx initial + déplacementx, pointy initial + déplacementy, point initialz + déplacementz) en branchant les coordonnées au temps 1 dans les fonctions maintenant découvertes, il crache juste une surface qui ressemble à la surface au temps 1.
Qu'est-ce qui ne va pas? Choses que j'ai essayées:
Suspicions: je pense que cela a à voir avec la distribution inégale des coordonnées initiales (x, y, z), mais je ne sais pas pourquoi ni comment résoudre le problème, ni même quelle méthode je peux utiliser.
Si vous avez lu jusqu'ici, merci beaucoup. Tout avis serait grandement apprécié.
Figure pour référence: vert = points prédits au temps 2. Chevauchant principalement avec du rouge, les coordonnées réelles des points au temps 1. bleu sont les coordonnées correctes des points au temps 2 (c'est là que les verts devraient être si les choses fonctionnaient ).
Lien mis à jour pour les fichiers: http://a.tmp.ninja/eWfkNmFZyTFk.zip Contenu - code, exemples de données (veuillez charger les fichiers .mat).
Je ne peux pas accéder au code que vous avez publié, alors voici quelques suggestions générales.
Il semble que la boîte à outils d'ajustement de courbe dispose d'outils qui font exactement ce que vous recherchez, consultez le bas de cette page: https://www.mathworks.com/help/curvefit/polynomial.html#bt9ykh .
Il semble que quelle que soit la fonction que vous avez apprise, le déplacement est tout simplement très petit ou nul partout. Je soupçonne que le problème n'est qu'une faute de frappe / erreur mineure de votre part quelque part dans votre pipeline, la traduction éventuelle de ce que vous devez travailler avec la fonction fit révélera le problème.
Cela ne devrait vraiment pas être le problème, mais à l'avenir, si vous aviez des données beaucoup plus déséquilibrées, vous pourriez tout normaliser avant de procéder à l'ajustement (x_norm = (x - x_mu) / x_std).
De plus, je ne pense pas que ce soit votre problème non plus, mais vous pouvez vérifier si votre matrice est proche du singulier en vérifiant le numéro de condition à l'aide de la fonction cord (). Vous pouvez donc vérifier cond (Adjust_B_matrix ' W Adjust_B_matrix). Deuxièmement, si vous consultez la documentation de lsqr, il existe une option pour obtenir un indicateur de retour de débogage, cela vaut également la peine d'être vérifié.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots