Comment «conserver» la valeur attribuée aux variables dans DSolve?
Sep 18 2020
Considérez l'ODE suivant:
a = 0.8; b = 8;
v = DSolveValue[{
u[x] == a*(b* u'[x] + u''[x]),
u[4.925] == 4,
u'[4.925] == 0.625
}, u[x], x]
qui donne le message d'erreur
DSolveValue: For some branches of the general solution, the given boundary \
conditions lead to an empty solution
Cependant, les éléments suivants fonctionnent totalement:
a = 0.8; b = 8;
v = DSolveValue[{
u[x] == c*(d* u'[x] + u''[x]),
u[4.925] == 4,
u'[4.925] == 0.625
}, u[x], x] /. {c -> a, d -> b}
Mais c'est moche. Je pourrais utiliser Block, mais tout cela est à l'intérieur Module, et utiliser à l' Blockintérieur Moduledonne des avertissements comme celui-ci:
a occurs twice in a nested scoping construct in a way that is likely to be an error
Quelle est la meilleure façon de résoudre ce problème?
Réponses
4 MichaelE2 Sep 18 2020 at 05:57
J'aime votre "manière laide", mais une autre façon est d'utiliser des constantes exactes lorsque vous utilisez un solveur symbolique exact:
a = 8/10; b = 8;
v = DSolveValue[{u[x] == a*(b*u'[x] + u''[x]), u[4925/1000] == 4,
u'[4925/1000] == 625/1000}, u[x], x] // N
(*
-0.000851416 (0.780974 2.71828^(40.9101 - 8.15331 x) -
2208.78 2.71828^(0.153312 x))
*)
On peut omettre le // Nbien sûr. Le problème réside dans les expressions exponentielles avec des puissances réelles approximatives.