Matlab Simulink'te değişken zaman adımı ayarlandığında, eğer simülasyon sonsuz küçüklüğe giden zaman adımlarını denemeye kalkışıyorsa, bu büyük ihtimalle cebirsel bir döngüden dolayı gerçekleşmiş olabilir.

Bu durumda şöyle bir hata mesajını alabilirsiniz:

An error occurred while running the simulation and the simulation was terminated Caused by: Derivative of state 'QuadrupedRobot.Rev_A1.Rz.w' in block 'QuadrupedRobot/Rev A1' at time **2.2250738585072014E-308** is not finite. The simulation will be stopped. There may be a singularity in the solution. If not, try reducing the step size (either by reducing the fixed step size or by tightening the error tolerances)

Bu hata mesajının biraz yukarısında bir uyarı mesajı bulacaksınız.

Block diagram 'QuadrupedRobot' contains 1 algebraic loop(s). To see more details about the loops use the command **Simulink.BlockDiagram.getAlgebraicLoops('QuadrupedRobot')** or the command line Simulink debugger by typing sldebug('QuadrupedRobot') in the MATLAB command window. To eliminate this message, set Algebraic loop to "none".

Bu uyarı mesajındaki Simulink.BlockDiagram.getAlgebraicLoops komutuna tıkladığınızda cebirsel döngüleri size listeleyecektir.

Örneğin:

A = B + C

şeklinde bir denklemimiz olsun. Burada A; B ve C'ye bağlı olduğu görülmektedir. Fakat öyle bir bağıntı var ki A'nın değişmesi B ve C'yi de değiştiriyor olsun. Tam burada cebirsel bir döngü oluşmaktadır. Çünkü t = 0 anında B ve C henüz belli değil iken A'nın değerini B ve C'den hesaplamaya çalışıyoruz. Bunu engellemek için B ve C belli olduktan sonra A'yı hesaplayabilmek için ilk iterasyonda A'yı B ve C'den bağımsız yapıp daha sonra tekrar bağımlı yapmalıyız. Bunu da şu şekilde yapabiliriz:

if time<0.1
    A = 0;    
else
    A = B + C;
end

Bu şekilde yapıldığında için artık cebirsel döngü ortadan kaldırılmış olacak ve simülasyon düzgün bir şekilde çalışacaktır.


matlabsimulinkcebirsel döngütime step

Previous PostNext Post