logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Matlab 6.5, ode45: Jak wybrać rozwiązania dla silnika indukcyjnego?

ma3-4ysz 27 Lis 2006 21:27 8588 4
  • #1 3270351
    ma3-4ysz
    Poziom 24  
    Posty: 812
    Pomógł: 49
    Ocena: 284
    Witam

    Programuje troche (symuluje) w matlabie 6.5 silnik indukcyjny klatkowy dwufazowy przy pomocy skrypcików zawartych w plikach „plik.m” oraz „plikfun.m” umieszczonych w folderze „work”. Plik „plikfun.m” zawiera prawe strony rozwiązywanych równań:

    
    %plikfun.m
    %prawe strony równań
    function yprime=plikfun(t,y);
    global R B G p Uds Uqs alfa omega1 D J
    i=[y(1:4)];
    u=[sqrt(2)*Uds*cos(omega1*t); % wektor napięć zasilających
        sqrt(2)*Uqs*cos(omega1*t+alfa);
        0;
        0];
    TL=0; %moment obciążenia
    Te=p*i'*G*i; %moment elektromagnetyczny
    t %wyświetla czas symilacji
    yprime=[-B*((R+p*y(5)*G)*i-u);
        1/J*(Te-TL)-D/J*y(5);
        y(5)];
    


    Natomiast plik „plik.m” jest skryptem głównym (uruchamianym):

    
    %plik.m
    %ten skrypt uruchamiać: silnik indukcyjny klatkowy dwufazowy - rozruch
    clc;
    clear;
    global R B G p Uds Uqs alfa omega1 D J
    %parametry zasilania
    Uds=380;
    Uqs=380;
    fn=50;
    alfa=pi/2;
    omega1=-2*pi*fn;
    %parametry silnika
    Rs=0.62;
    Rr=0.84;
    Ls=0.097;
    Lr=0.097;
    M=0.087;
    D=0;
    J=0.104;
    p=2;
    R=[Rs,0,0,0;
        0,Rs,0,0;
        0,0,Rr,0;
        0,0,0,Rr];
    L=[Ls,0,M,0;
        0,Ls,0,M;
        M,0,Lr,0;
        0,M,0,Lr];
    G=[0,0,0,0;
        0,0,0,0;
        0,M,0,Lr;
        -M,0,-Lr,0];
    B=inv(L);
    tpocz=0;%poczatek symulacji
    tkonc=1;%czas koncowy symulacji
    [t,y]=ode45('plikfun',[tpocz,tkonc],[0,0,0,0,0,0]);
    %menu do wykresow 
    close all
    while 1
       clc;
        k=menu('wykresy',' Ids=f(t)','Iqs=f(t)','nieprzeliczony Idr=f(t)','nieprzeliczony Iqs=f(t)','fi=f(t)','w=f(t)','Exit=Wyjscie');
        if (k==1) plot(t,y(:,1)), grid, title('prad stojana fay A Ids=f(t)'), xlabel('t[s]'), ylabel('Ids[A]');
        elseif (k==2) plot(t,y(:,2)), grid, title('prad stojana fay B Iqs=f(t)'), xlabel('t[s]'), ylabel('Iqs[A]');
          elseif (k==3) plot(t,y(:,3)), grid, title('nieprzeliczony prad wirnika fazy A Idr=f(t)'), xlabel('t[s]'), ylabel('Idr[A]');
              elseif (k==4) plot(t,y(:,4)), grid, title('nieprzeliczony prad wirnika fazy B Iqs=f(t)'), xlabel('t[s]'), ylabel('Iqs[A]');
                  elseif (k==5) plot(t,y(:,6)), grid, title('kat obrotu fi=f(t)'), xlabel('t[s]'), ylabel('fi[rad]');
                      elseif (k==6) plot(t,y(:,5)), grid, title('predkosc katowa w=f(t)'), xlabel('t[s]'), ylabel('w[rad/s]');                  
        elseif (k==7) break
        end
    end
    close all
    


    W skrypcie tym wywoływana jest funkcja ode45 numerycznego całkowania układu równań. Jest to funkcja zmiennokrokowa – sama dobiera sobie krok czasu tak aby utrzymać dokładność obliczeń równą 1e-6.
    I tu jest pies pogrzebany. Wynikiiem działania [t,y]=ode45('plikfun',[tpocz,tkonc],[0,0,0,0,0,0]); jest macierz [t,y], której pierwszą kolumną są kroki czasu (o zmiennym przyroście) a kolejnymi są wyliczone odpowiadające krokom czasu wartości prądów stojana, wirnika, kąt fi, prędkość kątowa np.:
    
    >>[t(100:105),y(100:105,:)]
    %[    t        Ids        Iqs       Idr      Iqr        w        fi     ] =[t,y]
        0.0494    6.1714   99.6758   -7.2007  -82.6593   12.3952    0.4626
        0.0507  -27.3934   91.4330   22.5955  -74.4526   12.2016    0.4780
        0.0519  -54.6976   71.5158   46.4703  -55.9551   12.4990    0.4931
        0.0531  -72.4857   42.9546   61.5772  -29.9715   13.2575    0.5089
        0.0544  -78.1688    9.8695   65.7002   -0.2679   14.3984    0.5258
        0.0556  -70.9107  -22.9422   58.2102   28.8259   15.7881    0.5444
    


    Dla podanych w plikach parametrów silnika, zasilania i czasu symulacji kroków symulacji jest 6589 (podkreślam ze zmiennym krokiem).
    Mój problem polega na tym, że z tych 6589 rozwiązań(w danych warunkach – może być ich więcej) symulacji od czasu „tpocz” do czasu „tkonc” musze wybrać 4000 ze stałym krokiem! dt = (tkon-tpocz)/4000. Czyli z macierzy [t,y] o wymiarach 6589(lub więcej)x7 o zmiennym przyroście argumentu t potrzebuję wybrać macierz [t1,y1] o wymiarach 4000 x 7 ze stałym przyrostem argumentu t1 równym dt = (tkon-tpocz)/4000. Wiadomo, że dla stałego przyrostu dt nie będzie w macierzy [t,y] odpowiadających mu elementów (z wyjątkiem pierwszego i ostatniego- chyba że przypadek) więc dany element trzeba będzie obliczyć jako średnią sąsiednich.
    „szkic”:
    t: +.................+...+.....+.....+.........+...............+......+...+...+.........+............+.......+
    t1:*............. *.............*.............*.............*.............*.............*.............*.............*
    gdzie:
    t - wektor czasu z [t,y], t1 – wektor czasu z [t1,y1], + - 6589 rozwiązań z funkcji ode45, * - 400 rozwiązań, które nie wiem jak wybrać

    Niestety w matlabie nie jestem zbytnio otrzaskany i na razie nie wiem jak to napisać, zwracam się więc do Was o pomoc, za którą z góry dziękuję
  • #2 3359112
    ma3-4ysz
    Poziom 24  
    Posty: 812
    Pomógł: 49
    Ocena: 284
    Witam,
    sam coś nadziergałem:
    
    %+++++++++WYBIERANIE nowego wektora [t1,y1]+++++++++++++++++++++++++++++
    %dt = (tkonc-tpocz)/i
    %y(1) i stojana1
    %y(2) i stojana2
    %y(3) i wirnika1
    %y(4) i wirnika2
    %y(5) w czyli omega
    %y(6) fi=kat obrotu
    %[t,y]=[t, i1, i2, i3, i4, w, fi]
    %      [1,  2,  3,  4,  5, 6, 7 ]
    %k  - przebiega po wektorze od 1 do i
    %k1 - przebiega po wektorze rozwiązań z ode45
    i=1000; 
    dt = (tkonc-tpocz)/(1000-1);
    for k=1:i; % wektor k od 1 do i
        t1(k)=(k-1)*dt;%t1(1)=tpocz=0    t1(i)=tkonc=1
        for k1=1:max(size(t)); %
            if (((t1(k)+0.00000000001)>=(t1(k)))&((t1(k)-0.00000000001)<=(t(k1))))%niedokładnie to gdzieś w okolicy+/-ileś
                if t1(k)<(t(k1))% mniwjsze
                    y1(k,:)=(y(k1,:)+y(k1+1,:))/2;%średnia
                    
                    break;
                end;
                if t1(k)>(t(k1))% większe
                    y1(k,:)=(y(k1,:)+y(k1-1,:))/2;%średnia
                    
                    break;
                end;
            end;
            if t1(k)==(t(k1))% t1(k)==t(k1) dokładnie
                y1(k,:)=y(k1,:);
                break;
            end;
        end;
        k
    end;
    %++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    

    Zamiast tej średniej lepiej pewnie aproksymować liniowo sąsiednie wyniki(większa dokładność napewno).
    Może sie komuś przyda to co nadziergałem.
    Pozdrawiam

    PS Te pliki (skrypty) silnika to zaczerpnąłem z:
    Jan Prokop:"Elektromechaniczne przetworniki energii - ćwiczenia",Oficyna Wydawnicza Politechniki Rzeszowskiej 1993
  • #3 3362265
    qrdel
    Poziom 28  
    Posty: 1074
    Pomógł: 100
    Ocena: 71
    W tej chwili nie siedzę w tym zbyt głęboko, ale wydaje mi się, że powinieneś zażądać podania kolejnych rozwiązań dla 4000 punktów.
    Albo wywołać tyle razy, być może każdy następny już liczony od poprzedniego; albo znaleźć możliwość zadania wymaganych punktów do podania rozwiązań, a kroki niech sobie zmienia pomiędzy. Gdzieś to widziałem, ale nie pamiętam czy akurat w Matlabie i to w standardowej funkcji (szukałem rozwiązywania równań sztywnych).
  • #4 3369326
    ma3-4ysz
    Poziom 24  
    Posty: 812
    Pomógł: 49
    Ocena: 284
    Witam,
    mnie zasadniczo chodziło o wybranie tych 4000 rozwoązań -- "nadziergałem" to powyżej (akurat 1000 -- szybciej), nawet działa.
    Owszem próbowałem ode45 zmusić do działania stałokrokowego. Plan był taki:
    1) zadać gorsza dokladnosc obliczeń, przeprowadzic symulacje, okreslic minimalny krok czasowy symulacji
    2)ustawić w OPTIONS maksymalny krok mniejszy od minimalnego wyznaczonego kroku z poprzedniej symulacji to powinno wymusić stalokrokowe obliczenia.
    
    OPTIONS = ODESET('RelTol',1e-2,'MaxStep',0.0001,'InitialStep',0.0001);
    [t,y]=ode45('plikfun',[tpocz,tkonc],[0,0,0,0,0,0],OPTIONS);
    

    Generalnie plan sie udał, tylko na początku symulacji kilka kroków obliczeń jest zerowych (w tym samym punkcie ???? tzn przyrost czasu=0), potem działało ze stałym krokiem do końca symulacji. Wadą tego rozwiązania jest duża liczba punktów obliczeniowych (niepotrzebnie) -- można sie :sleeping:
    Pozdrawiam
  • #5 10635115
    juma710
    Poziom 1  
    Posty: 1
    
    OPTIONS = ODESET('RelTol',1e-2,'MaxStep',0.0001,'InitialStep',0.0001);
    [t,y]=ode45('plikfun',[tpocz,tkonc],[0,0,0,0,0,0],OPTIONS);
    


    nie trzeba nic wybierać, jako 2 argument funkcji ode45 należy wpisać [tpocz:krok:tkonc] lub linspace(tpocz,tkonc,4000) i matlab grzecznie policzy w tych punktach równania różniczkowe.
REKLAMA