Entry 3266
preisach
Submitted by anonymous
on Feb. 27, 2010 at 11:41 a.m.
Language: Matlab. Code size: 3.9 KB.
clc close all clear all %%INIZIALIZZAZIONE DELLE VARIABILI E DELLE STRUTTURE DATI UTILIZZATE DAL MODELLO: % 1 - Caricamento valori del ramo ascendente del major loop ricavati sperimentalmente; p2f =fopen('ramo_ascendente_1.txt','r'); fu = fscanf(p2f, '%f',[1 13]); fclose(p2f); % 2 - Definizione vettori alfa e beta per la memorizzazione della "storia" % del sistema; alfa = zeros(1,30); beta = zeros(1,30); % 3 - Calcolo dell'uscita all'istante zero (condizione di reset della % memoria); f(1) = fu(indice(u(1))); %indice(): restituisce il corretto indice del vettore in base al valore dell'ingresso; % 4 - Inizializzazione dei valori estremi che delimitano il "piano di piano % di Preisach"; alfa(1) = 0.180; beta(1) = -0.180; % 5 - Inizilizzazione variabili di controllo del modello (numero di % segmenti orizzontali, valore precedente dell'ingresso, orientamento % ultimo segmento della L(t)); n = 1; up = u(1); L = 0; %6 - Inizializzazione della sequenza dei valori di input da dare al %sistema; u = [-0.180 -0.150 -0.120 -0.100 -0.080 -0.050 -0.010 0.050 0.080 0.100 0.120 0.150 0.180 0.150 0.120 0.100 0.080 0.050 -0.010 -0.050 -0.080 -0.100 -0.120 -0.150 -0.180]; %% MODELLO DI PREISACH NON LINEARE: for i=2:length(u) calcola = 1; % caso in cui l'ingresso รจ pari al valore di saturazione positiva % (negativa): if( u(i) == 0.180 ) alfa(n+1) = u(i); n = 1; f(i) = fu(indice(u(i))); calcola = 0; elseif( u(i) == -0.180 ) f(i) = fu(indice(u(i))); calcola = 0; n = 1; end while (calcola) % Distinzione dei casi in base all'orientamento dell'ultimo segmento della L(T): switch (L) case 0 % L(t) orizzontale % u(k)>u(k-1): if ( u(i) > up ) if ( u(i) < alfa(n) ) alfa(n+1) = u(i); %aggiungi un nuovo alfa calcola = 0; elseif ( u(i) >= alfa(n) ) alfa(n) = u(i); %aggiorna alfa if ( n>1 ) n = 1; end calcola = 0; end end % u(k)<u(k-1): if ( u(i) < up ) if ( u(i) > beta(n) ) %aggiungi un nuovo beta beta(n+1) = u(i); n = n + 1; L = 1; %passa al caso L(t) verticale per il calcolo effettivo elseif ( u(i) <= beta(n) ) beta(n) = u(i); %aggiorna beta n = n + 1; L = 1; %passa al caso L(t) verticale per il calcolo effettivo end end case 1 % L(t) verticale % u(k)>u(k-1): if ( u(i) > up ) if ( u(i) < alfa(n) ) alfa(n+1) = u(i); %aggiungi un nuovo alfa L = 0; %passa al caso L(t) orizzontale per il calcolo effettivo elseif( u(i) >= alfa(n) ) alfa(n) = u(i); %aggiorna alfa n = n - 1; L = 0; %passa al caso L(t) orizzontale per il calcolo effettivo end % u(k)<u(k-1): elseif ( u(i) < up ) if ( u(i) > beta(n-1) ) beta(n) = u(i); %aggiorna beta calcola = 0; elseif ( u(i) < beta (n-1) ) beta(n-1) = u(i); %aggiorna beta n = n - 1; calcola = 0; end end end end P = 0; % implementazione formula (4.3) pag. 57 if n >= 2 for k=2:n P_1 = preisach_dib(alfa(k),beta(k-1),u(i)); %preisach_dib(): funzione che prendendo in ingresso alfa, beta if (beta(k) == u(i)) %e il valore corrente dell'ingresso restituisce il valore di P(alfa,beta,u); P_2 = 0; else P_2 = preisach_dib(alfa(k),beta(k),u(i)); end Pk = P_1 - P_2; P = Pk + P; end f(i) = fu(indice(u(i))) + P; else f(i) = fu(indice(u(i))); end up = u(i); end
This snippet took 0.03 seconds to highlight.
Back to the Entry List or Home.