2014-05-23 3 views
0

J'ai un modèle qui prend la racine de l'entrée dans un bloc fonction matlab. L'entrée devrait toujours être positive cependant, simulink donne parfois un nombre négatif. La raison en est que j'utilise un solveur implicite (ode15s en raison de l'autre partie du système étant rigide) et simulink avoir une estimation invalide. Ma question est: comment puis-je dire simulink que l'entrée est invalide ce qui fait que le solveur fait un pas plus petit (sans s'arrêter)? Puis-je retourner une valeur spéciale (par exemple, NaN) ou lancer une erreur (sans arrêter la simulation)?Entrée Simulink non valide

Répondre

0

Ma solution consistait à ajouter une autre sortie, isInputValid. C'est 0 si l'entrée est invalide et 1 si l'entrée est valide. Cette sortie est ensuite intégrée par un nouveau bloc d'intégration. Il semble que la discontinuité produite par la variable booléenne s'assure que l'intégrateur effectue des étapes plus petites.

Exemple:

if (u<0) 
    y = -realmax; 
    isInputValid = 0; 
else 
    y = sqrt(u); 
    isInputValid = 1; 
end 

Puis un intégrateur attach à la sortie de isInputValid.

0

Vous pouvez retourner 0 dans votre bloc de fonction Matlab si l'entrée est négatif:

if u<=0 
    y = 0; 
else 
    y = sqrt(u); 
end 

u est l'entrée et la sortie y de la fonction.

+0

Merci, mais cela va continuer la simulation avec un faux modèle. L'objectif est que l'intégrateur recule et prenne des mesures plus petites, de sorte qu'il n'utilise pas d'entrée non valide. –

+0

Je ne pense pas que vous pouvez faire ce que vous voulez. La seule chose que je peux suggérer est de spécifier un plus petit 'MaxStepSize' dans les paramètres de simulation, mais cela rendra le temps de simulation plus long. – am304

0

Utilisez le Hit Crossing Block pour forcer le solveur à prendre de petits pas de temps lorsque votre signal approche de zéro. Cela fonctionnera en supposant que votre modèle est correctement configuré pour forcer le signal à ne pas être inférieur à zéro (c'est-à-dire qu'il fonctionne comme un bloc Abs, qui atteindra zéro et continuera avec une valeur positive).