Régression des moindres carrés pour système d'équations non linéairesBonjour - J'ai un modèle moyennement complexe pour un processus physique (adsorption ionique pour tous ceux qui savent ce que cela signifie). J'ai deux variables de départ, x1 et x2, et deux résultats mesurés, y1 et y2 qui changent avec x1 et x2, et des variables non mesurables ou difficiles à mesurer, g1,...,gn qui ne changent pas. L'un ou les deux de x1 et x2 peuvent également changer pour chaque ligne d'une série. J'ai un ensemble d'équations non linéaires, s = f(x1, x2, y1,...,y2, g1,...,gn), ainsi que quelques autres fonctions de différentes variables dans f, en fonction de la complexité de moi. je veux que le modèle soit. Voir la pièce jointe pour des exemples d'équations.
La façon typique de procéder est dans Matlab avec lsqnonlin. Fonctionne bien, mais c'est un ours à mettre en marche. Je préférerais de loin avoir une formule de colonne (pas si simple). Cependant, je ne sais pas vraiment comment le coder. La régression non linéaire est conçue pour des équations uniques, et avec les trois équations qui décrivent toutes les mêmes s, il semble que la récursion serait abondante. Je ne sais pas non plus quelle serait la fonction de perte. Dans Matlab, nous saisissons les valeurs de supposition, calculons les moindres carrés entre la supposition et la valeur calculée, la mettons à jour si la somme des différences au carré de toutes les suppositions et équations se situe en dehors d'une certaine tolérance, puis effectuons une boucle. Je suppose que cela est fait en interne par la plate-forme non linéaire, mais mon objectif est-il alors nul puisque je veux que la somme des différences au carré soit nulle ? Ou sinon, comment faire plusieurs équations ?
Je m'excuse si c'est beaucoup plus simple que je ne le pense.
Modélisation statistique avancéeles fenêtresRe : Régression des moindres carrés pour un système d'équations non linéaireUne solution que je suggère est une vieille astuce consistant à définir une fonction perdue appropriée. Dans votre cas, la fonction perdue peut être :
(s-f1(...))^2 + (s-f2(...))^2 + (s-f3(...))^2 + ...
Chaque élément est l'erreur quadratique d'une équation dans vos systèmes. Vous les résumez et minimisez l’erreur globale. Cette approche convertit un problème des moindres carrés non linéaires en un problème d’optimisation de fonction de perte.
En attendant, je pense que c'est toujours faisable en utilisant les moindres carrés non linéaires pour un système d'équations. Voici les étapes :
- Développez votre tableau de données. Pour chaque ligne, vous en faites des copies, et le nombre total de copies est identique à votre nombre d'équations dans votre système. Ce ajouter à pourrait être utile pour cette tâche. Vous devez créer une colonne Freq dont les valeurs de cellule correspondent au nombre d'équations.
- Vous devez maintenant créer cette colonne de formule pas si simple. Selon la façon dont vous disposez les lignes de la dernière étape, vous devrez peut-être écrire la formule différemment. Mais le but est le suivant. Pour chaque copie de la ligne d'origine, attribuez-la à une équation de votre système. Ainsi, en fin de compte, chaque copie d’une ligne est associée à une équation distincte dans votre système. Vous devrez probablement comprendre comment associer le numéro de ligne au numéro d’équation. Si les copies sont dans des lignes consécutives, comme résultat du complément ci-dessus, vous aurez peut-être besoin de la fonction "Modulo" pour effectuer le mappage.
En fin de compte, utilisez le non linéaire comme vous le savez pour résoudre le problème des moindres carrés.
Re : Régression des moindres carrés pour un système d'équations non linéaireJ'ai du code que j'utilise pour modéliser un processus d'adsorption d'humidité - il recherche des conditions d'équilibre telles que décrites par plusieurs modèles physiques - je vais voir si je peux créer une version générique du code que je peux partager ici.
Re : Régression des moindres carrés pour un système d'équations non linéaireSalut @peng_liu merci pour la réponse et désolé pour le retard de réponse! Dissertation + bébé de 2 mois font oublier de donner suite aux choses.
Que choisirais-tu comme s ? Je n'ai aucun s mesuré, et dans le code matlab, nous devinons un s, puis mettons à jour. Comment suggéreriez-vous de procéder ?
Quant à la méthode des moindres carrés, elle semble intéressante. Avez-vous un tableau que vous avez réalisé pour un autre projet que je pourrais consulter et qui fait une chose similaire ? Malgré tous mes scripts, je n'ai pas fait grand-chose avec les formules basées sur les lignes et j'ai échoué de façon spectaculaire lorsque je l'ai fait.
Re : Régression des moindres carrés pour un système d'équations non linéaireSalut @David_Burnham - oui, si vous aviez une version générique de cela, ce serait extrêmement utile.Re : Régression des moindres carrés pour un système d'équations non linéaireToutes nos félicitations!
Donc, « s » est un paramètre inconnu ici. Dans ce cas, réécrivez toutes vos équations comme ceci : 0 = f(...) - s.
Ou si vous connaissez des quantités dans vos équations, déplacez-les vers la gauche. Le côté gauche sera votre Y lorsque vous utiliserez la plateforme non linéaire.
Je n'ai pas d'exemples, alors j'en ai inventé un. Ci-joint : système absurde de eqns.jmp
Il a
- une colonne Y, des quantités connues.
- une colonne de formules, les éléments à droite de la taille de vos équations
- une colonne d'étiquette indique que les lignes impaires correspondent à la première équation et que les lignes paires correspondent à la deuxième équation
- d'autres quantités connues qui font partie de l'équation du côté droit.
Regardez la formule dans la colonne « formule » pour voir comment répartir deux équations dans une seule colonne.
Re : Régression des moindres carrés pour un système d'équations non linéaireMerci pour les conseils @peng_liu !
J'ai créé un tableau et cela semble fonctionner si j'ai quelques lignes, mais si j'essaie d'en faire plus de quelques-unes, cela me donne ceci :

Est-ce effectivement un problème dû au fait d'avoir trop de lignes ? L'erreur semble persister si je réduis les lignes au minimum (3 dans ce cas) et que je dois aller faire un nouveau tableau. Avez-vous des idées à ce sujet ? Voici le tableau que j'ai réalisé avec une version barebones du modèle pour qu'il ne soit pas encombrant. J'ai également placé les paramètres dans leurs propres colonnes (Phi0, sigma0, pHf) et des formules intermédiaires étendues pour faciliter l'examen de la formule de la colonne.
Re : Régression des moindres carrés pour un système d'équations non linéaireJe ne sais pas comment exécuter la plateforme non linéaire à l'aide de ce tableau de données. Quel est Y, quel est X ?
Mais si la colonne "Formule" est X, je ne pense pas que cela fonctionnerait. La formule de X doit utiliser des paramètres et non des variables de tableau.
Voici à quoi ressemble la colonne X dans cette "table de données absurdes".

Votre colonne "Formule" ne contient rien sous Paramètres.
Re : Régression des moindres carrés pour un système d'équations non linéaireHé @peng_liu - Oui, parce que les paramètres rendaient la formule 100 fois plus longue, je les ai mis dans les colonnes Phi0, sigma0 et pHf (colonnes 6 à 8 après la colonne avec un "." comme titre), puis j'ai sélectionné le Boîte "Développer les formules intermédiaires" en bas de la plateforme non linéaire. De cette façon, je peux utiliser les paramètres, mais ils ne rendent pas la colonne de formule impossible à utiliser, car il y a tellement de "catégories étendues" pour chaque paramètre.
Cela a-t-il du sens?
La capture d'écran ci-jointe doit montrer ces colonnes et leur emplacement dans la formule, au cas où cela rendrait les choses plus claires.
Re : Régression des moindres carrés pour un système d'équations non linéaire@peng_liu Je dirai également que j'ai trouvé que 1) l'option de dérivées numériques uniquement semble la faire passer à la plate-forme principale, et 2) que lorsque j'ai des paramètres dans plus d'une des équations, cela semble donner cela erreur. Je ne sais pas si cela vous dit quelque chose. Je ne trouve tout simplement pas de référence à cette erreur, donc je suis perplexe.
Re : Régression des moindres carrés pour un système d'équations non linéaireMerci d'avoir expliqué, @ehchandler Je comprends ce que tu fais maintenant. Ce que vous faites est une bonne astuce pour un problème aussi compliqué. Quelque chose de nouveau pour moi !
J'ai regardé le message d'erreur. Vous devez cocher « Dérivés numériques uniquement ».

Vous disposez de plus de 300 paramètres, la dérivée symbolique sous-jacente atteint une limite.
Je vois que vous avez 337 lignes, mais 339 paramètres. Ce sous-ensemble n’obtiendra pas de solution. J'espère que votre ensemble complet n'a pas ce problème.
Pendant ce temps, pendant que je regarde votre configuration, quelque chose est intéressant. Je ne connais pas ton sujet. Mais dans votre configuration, Phi0, sigma0 et pHf sont des fonctions discrètes de pH0. Les relations entre les trois et pH0 sont-elles connues ? Si des relations continues (avec moins de paramètres inconnus) sont connues entre eux, vous pourriez réduire considérablement le nombre de paramètres.
Re : Régression des moindres carrés pour un système d'équations non linéaire@peng_liu D'accord, cela a plus de sens. Connaissez-vous la limite du nombre de termes ou de paramètres dans le code dérivé symbolique ? Parce que je pense que je peux simplement avoir une colonne avec quelques chiffres, puis segmenter le calcul à l'aide de la fonction "par". La dérivée symbolique est tellement plus rapide.
Et hummm. Je ne sais pas d'où viennent les nouveaux paramètres. Je vérifierai à mon arrivée. Merci d'avoir remarqué cela. Trois questions connexes : 1) comment avez-vous vu le nombre de paramètres et 2) existe-t-il un moyen de supprimer en bloc des paramètres dans le menu de formule de colonne ? Autant que je sache, vous devez faire un clic droit, cliquer sur supprimer un par un. 3) existe-t-il un moyen d'utiliser un tableau pour saisir les paramètres et leurs limites ? Cela aiderait vraiment à accélérer.
Merci!
Re : Régression des moindres carrés pour un système d'équations non linéaireLa limite n'est pas en termes de nombre de paramètres. Mais le nombre de paramètres est un facteur dans votre cas. Donc il faut essayer et voir.
Je vois que votre système a trois types de paramètres distincts : Phi, sigma, pHf. Ils sont tous conditionnés à la valeur de pH0. Par conséquent, les paramètres sont indépendants des différents pH0. Donc, vous avez raison, faire un ajustement « Par » peut réduire la complexité.
PS "By" ne fonctionne pas comme je le souhaitais. Toutes les lignes voient tous les paramètres de la colonne. Je ne vois pas qu'il soit possible de laisser des lignes individuelles dans By pour voir uniquement un sous-ensemble de paramètres.
Je vois le nombre de paramètres après le lancement du Nonlinear. Il existe une multitude de paramètres. Je fais un clic droit et crée un tableau à partir de celui-ci, compte les lignes. Pour les deux dernières lignes, je suggérerais simplement de modifier la formule JSL. Ouvrez l'éditeur de formule de la colonne. Copiez-le et collez-le dans un éditeur JSL. Après l'édition, copiez et collez. Ainsi, vous pouvez éditer la liste des paramètres :
La section "1" est votre liste de paramètres. Le « 2 » est la véritable formule.

Re : Régression des moindres carrés pour un système d'équations non linéaireSuivez la façon d’utiliser « Par ».
Il semble qu'il existe un moyen d'utiliser By et de réduire le nombre de paramètres pour profiter de l'indépendance entre les lignes.
Je joins la v2 du "système absurde". Expliquez d'abord ce que j'ai mis en place.

J'ai mis en place deux systèmes d'équations linéaires. Les lignes 1 et 2 correspondent au système « a », la colonne Groupe. Et les rangées 3 et 4 sont le système "b".
Chaque système linéaire possède deux paramètres « b0 » et « b1 », mais ils sont différents selon les systèmes. Et j'utilise les paramètres x1 et x2 pour produire "SimY". Je copie SimY vers Y pour mon analyse.
Regardez maintenant la colonne "formule", je ne différencie pas "b0" et "b1" par groupe.

Exécutez maintenant Nonlinear avec By = Group. Et voici le rapport :

Il trouve des solutions distinctes et correctes pour les systèmes respectifs.
Re : Régression des moindres carrés pour un système d'équations non linéaire@peng_liu Oui, j'avais également rencontré ce problème. Votre solution semble bonne ! Cependant, lorsque j'essaie de l'appliquer à ma table, une erreur apparaît. Voyez-vous un problème flagrant dans le tableau ci-joint ? les Phi0, sigma0 et pHf sont tous les mêmes qu'avant. Cependant, j'ai créé une colonne "catégorisation cyclique" pour la méthode "par" que vous avez mentionnée, mais j'ai ensuite un "paramètre par colonne". J'utilise les niveaux de cette colonne pour développer les paramètres par catégories. Puisque :Catégorisation cyclique et :Paramètre par colonne sont orthogonaux (ou quel que soit le mot correct), cela devrait permettre aux paramètres de parcourir toute la courbe avec de légers décalages (pH0 est l'axe des x), puis je peux simplement les assembler encore une fois à la fin. Cependant, comme je l'ai dit, il échoue et ne met à jour qu'un des niveaux de paramètres, et je ne sais pas pourquoi.
Cela pourrait-il être un problème avec la façon dont by interagit avec les paramètres développés par catégories ?
Re : Régression des moindres carrés pour un système d'équations non linéaireVous avez des valeurs manquantes dans la colonne 3, ce qui explique pourquoi un seul groupe a un résultat. Mais la « formule » n’est pas mise en place comme je le préconisais. Je joins test.v2 pour illustrer. Avec cette approche, vous n'avez plus besoin des Phi0, sigma0 et pHf au milieu.
Re : Régression des moindres carrés pour un système d'équations non linéaire@peng_liu Oh duh. Je ne sais pas comment j'ai raté autant de lignes manquantes. Merci d'avoir remarqué cela.
Alors peut-être que j'ai mal compris, mais puisque pH0 est mon axe x, votre solution signifie-t-elle simplement que la colonne by est la colonne x ? comme si vous aviez 100 x valeurs, vous avez 100 « groupes » pour ainsi dire ?
Si tel est le cas, la version développée par colonnes ne serait-elle pas meilleure puisque vous minimisez l'erreur sur plusieurs points plutôt qu'une simple minimisation autonome pour chacun ? Ou est-ce que le point par point est une meilleure façon de traiter les fonctions de perte ? J'adapte simplement le code Matlab que j'avais à JMP, mais je n'ai pas vraiment d'expertise en algorithmes de minimisation, donc quelle que soit la meilleure technique, je suis partant.
PS Et peut-être que je n'ai pas été clair, mais il devrait y avoir un ensemble unique de valeurs de chacun des paramètres pour chaque valeur pH0 (qui est la variable dépendante). C'est pourquoi j'ai pensé que je devais développer par catégories.
Merci!
Re : Régression des moindres carrés pour un système d'équations non linéaireJe vois que votre colonne "formule" dans le tableau d'origine dépend du pH0. Mais la colonne "formule" de votre test.jmp ne dépend pas du pH0. Je suppose que c'est un malentendu entre nous. Permettez-moi toujours d'utiliser vos données d'origine, donc Phi0, sigma0, pHf dépendent de pH0, pas de "Paramètre par colonne".
Regardons les trois premières lignes :

Leur pH0 = 0,2. De ce fait, la formule de la première ligne peut être notée par :
f1(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2).
Les formules des 2e et 3e lignes sont :
f2(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2) et
f3(Phi0_pH0_0.2, sigma0_pH0_0.2, pHf0_pH0_0.2). Les trois lignes forment le groupe 1.
Regardez maintenant les lignes 4, 5, 6. Leur pH0 = 0,3. Les trois formules sont donc :
f1(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3),
f2 (Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3), et
f3(Phi0_pH0_0.3, sigma0_pH0_0.3, pHf0_pH0_0.3). Les trois lignes forment le groupe 2.
Group1 et Group2 ne partagent pas le même ensemble de paramètres. Ils sont indépendants. La réduction des erreurs pour Group1 n'a rien à voir avec la réduction des erreurs pour Group2. Ainsi, nous pouvons optimiser groupe par groupe.
Si vous conservez les paramètres définis dans les trois colonnes intermédiaires comme Phi0_pH0_0.2, Phi0_pH0_0.3, Phi0_pH0_0.4, etc., chaque ligne les voit tous. Vous pouvez voir que si vous exécutez Nonlinear par pH0, chaque groupe aura des centaines de paramètres répertoriés. Mais parmi eux, seuls trois sont pertinents pour chaque ligne, et toutes les trois lignes.
Ce que j'ai fait, c'est créer trois paramètres seulement, à l'intérieur de la colonne "formule". Je les ai nommés paramPhi0, paramSigma0, parampHf. Même s'il n'y en a que trois, lorsque nous exécutons Nonlinear par "pH0", la plateforme créera différents ensembles des trois paramètres par "pH0". Il crée littéralement ces centaines de paramètres pour vous par « pH0 ». Et chaque petit non-linéaire de pH0 n'a qu'à se soucier de trois paramètres.