Je veux résoudre l'équation suivante en python. Le problème est que la variable dépendante «y» est également présente dans le côté droit de l'équation. Première question, comment ces équations sont-elles nommées en mathématiques?
Je peux la résoudre si je saute le «y» du RHS. Mais aucune idée de comment résoudre le problème en le maintenant en place.
J'ai utilisé le code suivant: importer numpy en tant que np depuis matplotlib importer pyplot comme plt
A=2 B=1.3 C=0.25 D=1.25 def func(x,A,B,C,D): y=A*np.sinh(((x)/B-C)/D) #I skipped (x-y) here return y x=np.linspace(-3,3,200) y=func(x,A,B,C,D) plt.plot(x,y) plt.show()
3 Réponses :
De telles équations non linéaires sont souvent résolues de manière itérative. Définissez y = 0
, résolvez l'équation, obtenez un nouveau y
, insérez la nouvelle valeur dans RHS et répétez le processus. Suivez la valeur y (j) -y (j-1)
pour vérifier la convergence. Si ce n'est pas le cas, essayez de mélanger la partie RHS précédente avec une partie actuelle avec un certain poids: RHS (j) = w * RHS (j) + (1-w) RHS (j-1). Voici quelques liens utiles à ce sujet:
Livre : Solution itérative d'équations non linéaires en plusieurs variables Par JM Ortega, WC Rheinboldt
Voici votre exemple modifié:
import matplotlib.pyplot as plt A=2 B=1.3 C=0.25 D=1.25 def func(x,z,A,B,C,D): y=A*np.sinh(((x-z)/B-C)/D) #I skipped (x-y) here return y x=np.linspace(-30,30,200) y = np.zeros(x.shape) w = 0.99999999 d = 10 track_d = [] while d > 0.0000001: track_d.append(d) temp = y y = w * y + (1-w) * func(x,y,A,B,C,D) d = np.max(np.abs(temp-y)) y=func(x, y,A,B,C,D) plt.plot(x,y) plt.show() # look at the convergence plt.plot(track_d) plt.show()
Pour un intervalle plus grand, cela semble plus intéressant, faites attention au paramètre w.
import matplotlib.pyplot as plt A=2 B=1.3 C=0.25 D=1.25 def func(x,z,A,B,C,D): y=A*np.sinh(((x-z)/B-C)/D) #I skipped (x-y) here return y x=np.linspace(-3,3,200) y = np.zeros(x.shape) w = 0.4 d = 10 track_d = [] while d > 0.01: track_d.append(d) temp = y y = w * y + (1-w) * func(x,y,A,B,C,D) d = np.max(np.abs(temp-y)) y=func(x, y,A,B,C,D) plt.plot(x,y) plt.show() plt.plot(track_d) plt.show()
toujours je ne vois pas comment cela converge, expliquez pls facilement et j'écrirai la fonction
dans l'intervalle que vous avez défini, cela ressemble à une fonction linéaire.
soit x = 3, y = 0, sinh t = (e ^ t - e ^ -t) / 2, t = (3 / 1,3- 0,25) / 1,25 = 1,64, e ^ 1,64 = 5 - 0,19 ~ 5> 3 , en plus il y aura de plus grands nombres, ça ne converge pas ou je suis stupide aujourd'hui?
Ce n'est pas une fonction, c'est une courbe algébrique (toutes les fonctions peuvent être des courbes algébriques, mais l'inverse est faux). Vous demandez de tracer tous les points (x, y) satisfaisant l'équation y - bla (x, y) = 0. Rien n'est nécessaire pour converger. La première étape consiste à trouver un groupe de (x, y) par force brute en utilisant un niveau de tolérance au lieu de l'égalité. Les étapes suivantes sont des méthodes plus sophistiquées (il y en a beaucoup, voir le livre de Fulton).
Il convergera pour w = 0,99999999
SeF, si Alam demande une méthode mathématique, la question est hors-sujet. J'ai proposé une solution numérique et algorithmique plus proche des thèmes de ce forum. Pouvez-vous, s'il vous plaît, prouver que cela ne fonctionne pas en comparant avec une bonne courbe.
le sentiment de sauter quelque chose d'important à l'université: D
Montrez-moi la bonne courbe, est-elle différente de la sortie du code?
Merci!!! Existe-t-il une fonction de bibliothèque pour effectuer ce travail? Ou à chaque fois que je devrai écrire un code personnalisé comme celui que vous avez partagé?
C'est une technique assez standard en physique non linéaire. Recherchez des codes là-bas.
Votre équation peut être très simplifiée pour obtenir x en fonction de y . Tout d'abord, nous pouvons réécrire votre équation comme suit:
y = a * sinh (b * x + c * y + d)
Notez que cela vient avec des hypothèses non nulles sur A, B, C, D
b * x + c * y + d = arcsinh (y / a)
arcsinh peut être réécrit en utilisant logarithme naturel : b * x + c * y + d = ln (y / a + sqrt ((y / a) ** 2 + 1)))
Cela donne:
x = (1 / b) * (ln (y / a + sqrt ((y / a) ** 2 + 1))) - c * y - d)
Vous pouvez ensuite tracer ceci pour différentes valeurs de a, b, c, d.
Merci d'avoir résolu le problème spécifique. Mais je voulais poser une question générale pour les problèmes généraux qui ne peuvent pas être convertis en y = f (x) ou l'inverse. Je devrais probablement modifier un peu la question alors.
Votre fonction en général est appelée relation de récurrence dans le formulaire
Il peut être résolu numériquement en choisissant la valeur de départ de y, puis en la mettant dans l'équation, en calculant la valeur y suivante. Et répéter le calcul en mettant la valeur y suivante comme valeur y précédente dans l'équation. Les calculs sont répétés en boucle jusqu'à ce que la valeur y converge. La valeur Y peut ne pas converger. Même dans ce cas, vous pouvez analyser le système plus en détail. Vous pouvez essayer de tracer le graphique y n = f (y n-1 ) et voir ce que vous avez. Dans le cas où le système est stable , la courbe doit être très périodique et fermée , sinon le système non convergent est chaotique et de telles équations la fenêtre.
Quelques exemples de systèmes stables sont les courbes de Lissajous :
Quelques exemples de systèmes chaotiques sont l'attracteur de Rossler :
Pour voir si votre système est stable ou non - essayons de moduler la fonction sin (x)
avec votre relation de récurrence de sin hyperbolique:
y = k * SIN (x) + 0.88 * SINH (-y-0.02)
et essayons de dessiner ce graphique paramétrique de récurrence de y prev vs y next .
k = 0
Pas grand chose à voir ici, car dans ce cas, nous obtenons votre équation d'origine qui a une très faible résolution entre les points de données. Ils se trouvent tous le long d'une ligne, avec une petite dispersion que nous ne pouvons pas différencier avec les yeux - c'est pourquoi nous avons besoin de sin (x) ici!
k = 0,0005
Beaucoup plus intéressant. Maintenant, on peut voir que votre «ligne» n'est pas du tout une ligne et a un comportement chaotique. Mais regardons quelque chose de plus attrayant.
k = 0,005
À certains endroits, la récurrence sinh () l'emporte, mais à certains - sin (). Essayons de forcer la victoire de la fonction sin (), pour pouvoir voir si elle sera modulée périodiquement et avec une boucle fermée ou non. Donc image finale.
k = 0,05
Donc, ce n'est ni très périodique, ni fermé. Nous avons un certain type d'attracteur. Ce qui signifie que dans un cas général, votre équation se comporte de manière très chaotique et qu'en tant que telle, elle ne vaut pas un centime. Bien sûr, dans votre plage de paramètres exacte, elle peut se comporter comme une fonction linéaire. Mais un petit segment infinitésimal d'un cercle réassemble également une ligne, qu'est-ce que cela signifie? Rien. Vous ne pouvez pas vous fier à une plage d'entrée très spécifique. Si votre unité commerciale change les exigences ne serait-ce qu'un peu , le comportement de votre équation changera radicalement. La seule étape rationnelle consiste donc à passer par la fenêtre et à reconstruire un modèle différent - cette fois stable - pour une donnée. Ou dites simplement que cela ne peut pas être fait.
Que se passe-t-il lorsque y = 0?
pourquoi ne pas déplacer y dans l'autre direction et résoudre votre équation = 0:
python ne résout pas l'équation pour vous avec juste func
@ user8426627 Je pense qu'Alam demandait comment définir une fonction qui résout un problème comme celui-ci. Alam, la manière typique de résoudre un problème comme celui-ci est de donner une valeur initiale à y, puis d'itérer un certain nombre de fois jusqu'à ce que vous convergiez vers la réponse attendue.
sont sûrs que convergeront
soit x = 3, y = 0, sinh t = (e ^ t - e ^ -t) / 2, t = (3 / 1,3- 0,25) / 1,25 = 1,64, e ^ 1,64 = 5 - 0,19 ~ 5> 3 , en plus il y aura de plus grands nombres, ça ne converge pas ou je suis stupide aujourd'hui?