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.