Bonjour,
J'ai conçu un problème générique pour une difficulté que je rencontre souvent sur des problèmes plus complexes.
Il s'agit de définir une fonction f[a,b] qui est la valeur x[tf] pour y[tf]=0 où x[t] et y[t] sont définis par des équations différentielles.
f[a0_, b0_] :=
Module[{a = a0, b = b0},
eq1 = x'[t] == a;
eq2 = y'[t] == b - 10 t;
sol = NDSolve[
{eq1, eq2, x[0] == 0, y[0] == 10},
{x, y},
{t, 0, \[Infinity]},
Method -> {EventLocator, "Event" -> y[t],
"EventAction" :> Throw[end = t, "StopIntegration"]}];
First[x[end] /. sol]]
Jusque là tout va bien comme le montre:
{f[5, 5], f[5, 20], f[20, 5], f[20, 20]}
{10., 22.2474, 40., 88.9898}
là, je tente l'optimisation (triviale ici):
NMaximize[{First[f[a, b]], 5 <= a <= 20, 5 <= b <= 20}, {a , b}]
et j'obtiens:
NDSolve::ndnum: Encountered non-numerical value for a derivative at t \
== 0.`. >>
ReplaceAll::reps: {NDSolve[{(x^\[Prime])[t]==a,(y^\[Prime])[t]==b-10 \
t,x[0]==0,y[0]==10},{x,y},{t,0,\[Infinity]},Method->{EventLocator,\
Event->y[t],EventAction:>Throw[end=t,StopIntegration]}]} is neither a \
list of replacement rules nor a valid dispatch table, and so cannot \
be used for replacing.
Alors que f est bien défini sur tout le domaine d'optimisation...
C'est sans doute une erreur assez simple que je n'arrive pas à détecter.
Est-ce que quelqu'un peux m'aider?
Lazlo
PS: désolé pour la mise en forme un peu cahotique, mais c'est pire en LaTex
f[a0_?NumberQ, b0_?NumberQ] :=
Module[{a = a0, b = b0, x, y, t, end},
First[x[end] /. NDSolve[
{x'[t] == a, y'[t] == b - 10 t, x[0] == 0, y[0] == 10},
{x, y},
{t, 0, \[Infinity]},
Method -> {EventLocator, "Event" -> y[t],
"EventAction" :> Throw[end = t, "StopIntegration"]}]]]
NMaximize[{f[a, b], 5 <= a <= 20, 5 <= b <= 20}, {a , b}]
{88.9898, {a -> 20., b -> 20.}}
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :