2017-09-27 3 views

Répondre

1

ode permet aux paramètres de fonction supplémentaire liste:

Il peut arriver que le simulateur f a besoin des arguments supplémentaires. Dans ce cas , nous pouvons utiliser la fonctionnalité suivante. L'argument f peut également être une liste lst = liste (f, u1, u2, ... un) où f est une fonction Scilab avec syntaxe: ydot = f (t, y, u1, u2, ..., un) et u1, u2, ..., un sont arguments qui sont automatiquement transmis au simulateur simuf.

paramètre supplémentaire est fonction de t

function y = f(t,y,h) 
// define y here depending on t and h(t),eg y = t + h(t) 
endfunction 

function y = h(t) 
// define here h(t), eg y = t 
endfunction 

// define y0,t0 and t 
y = ode(y0, t0, t, list(f,h)) // this will pass the h function as a parameter 

Extra est un vecteur pour lequel nous voulons extraire le terme correspondant.

Depuis ode seulement calculer la solution y à t. Une idée est de chercher Ti < t < Tj lorsque ode effectue un calcul et obtenir Hi < h < Hj.

Ce qui est assez laid, mais fonctionne totalement:

function y = h(t,T,H) 
    res = abs(t - T)   // looking for nearest value of t in T 
    minres = min(res)   // getting the smallest distance 
    lower = find(res==minres) // getting the index : T(lower) 
    res(res==minres)=%inf  // looking for 2nd nearest value of t in T: nearest is set to inf 
    minres = min(res)   // getting the smallest distance 
    upper = find(minres==res) // getting the index: T(upper) 
    // Now t is between T(lower) (nearest) and T(upper) (farest) (! T(lower) may be > T(upper)) 
    y = ((T(upper)-t)*H(lower)+(t-T(lower))*H(upper))/(T(upper)-T(lower)) // computing h such as the barycenter with same distance to H(lower) and H(upper) 
endfunction 

function ydot=f(t, y,h,T,H) 
    hi = h(t,T,H)  // if Ti< t < Tj; Hi<h(t,T,H)<Hj 
    disp([t,hi])  // with H = T, hi = t 
    ydot=y^2-y*sin(t)+cos(t) - hi // example of were to use hi 
endfunction 

// use base example of `ode` 
y0=0; 
t0=0; 
t=0:0.1:%pi; 
H = t // simple example 
y = ode(y0,t0,t,list(f,h,t,H)); 
plot(t,y) 
+0

J'ai lu cette aide dans Scilab et ne pouvait pas réussi à le faire fonctionner, mais avec votre exemple, il était facile! Cela résout 50% de mon problème, parce que maintenant je peux résoudre le problème direct en utilisant ceci, mais j'ai encore besoin de travailler avec le problème inverse, et pour cela j'ai besoin d'une autre fonctionnalité que je ne sais pas si SciLab. Existe-t-il un moyen de transmettre un paramètre en tant que vecteur après chaque fois que SciLab choisit automatiquement l'un après l'autre? Exemple: 't = [1 2 3]; h = [7 8 9]; sol = ode (yo, à, t, liste (f, h)) Donc, dans ce cas, il faudra utiliser h = 7 pour t = 1, h = 8 pour t = 2 et ainsi de suite. – Alexandre

+0

Amélioration de ma réponse. A écrit sur mon téléphone donc c'est seulement une conjecture. S'il vous plaît dites-moi si cela fonctionne! – PTRK

+0

Malheureusement, ce n'est pas le cas. J'ai imprimé les valeurs de t à l'intérieur de la fonction y = f (t, h, T) ... les valeurs sont totalement différentes de celles passées dans le vecteur t, curieusement il n'apparaît jamais les valeurs de t, d'où le 'h (find (t == T)) 'ne trouve jamais de valeur. Je peux avoir fait quelque chose de mal, cependant. Le seul moyen de le faire fonctionner était de mettre en œuvre Rung-Kutta, donc j'avais plus de contrôle sur les paramètres qui étaient passés. Mais j'apprécie vraiment votre aide. Merci beaucoup mon ami! – Alexandre