Buon Giorno e quasi Buon anno a tutti!
premetto che sono un profano nella progettazione di matlab.
ho riscontrato dei problemi nel trovare i parametri di un quadrilatero articolato. ho creato il codice, e non mi da problemi nel calcolo degli angoli della biella e della manovella. il problema inizia a crearsi quando provo a calcolare le velocità angolari, cosa che non riesco a spiegarmi.
NB : l' <x0_p> introdotto dovrebbe almeno restituire i valori di omega3 e omega4 dell'angolo 0°
visto che quel valore me lo sono calcolato con il metodo delle polari ( con matita e righello ).
vi allego la funzione principale e a seguire tutte le altre richiamate :
una tabella delle posizioni fi3 e fi4 per una sola configurazione possibile,
una tabella velocità omega3 e omega4, da dove però non riesce a stampare niente)
un grafico delle posizioni degli angoli fi3 e fi4 in funzione di fi2 (manovella)
function tabulaB( )
%calcolo delle posizioni di un quadrilatero articolato
caso =2;
x0 = [ .5 4.5 ] ;
x01 = [ 1 5.5 ] ;
tn = (pi/8)*(0:16);
col = zeros (length(tn),2);
for i=1:length(tn)
sol = NewRap( x0 , tn(i), caso );
solgrad = sol*180/pi ;
col(i,:) = RendiLegg ( solgrad , 360 ) ;
%--------------------------------------- primo controllo
if (tn(i)>pi)
sol = NewRap( x01 , tn(i), caso );
solgrad = sol*180/pi ;
col(i,:) = RendiLegg ( solgrad , 360 ) ;
end
%--------------------------------------fine primo controllo
%--------------ora creo i valori della configurazione alternativa
colla = [col(i,:),det(jacob(sol,caso))] ;
fprintf ('vars = %3.1f -----> ',tn(i)*180/pi) ; printa(colla);
end
%-------------------------------------tabella 2 : velocità
col_rad = col*pi/180;
col_p = zeros(length(tn),2);
tn_p = [ tn' omega2(tn')];
x0_p = [ 17.5 18.75 ];
for i=1:length(tn)
sol_p = NewRap_p ( x0_p , tn_p , col_rad(i,:) , caso );
sol_p = RendiLegg (sol_p,2*pi);
col_p(i,:) = sol_p;
fprintf ('vars = %3.1f ---%6.3f--> ',tn(i)*180/pi,omega2(tn(i))) ; printa(col_p(i,:));
end
%--------------------------------grafico------------------------
X = tn;
Y = col;
plot(X,Y);
legend ('fi3','fi4','location','NorthEastOutSide')
end
function [ var ] = funz( x , tn , caso )
%legge in ingresso il vettore delle <x> e di <tn> (termini noti)
% restituisce il vettore delle <var>,
%della stessa lunghezza del vettore delle <x>.
%sintassi :
% [var] = funz ( x , tn , caso)
%
% caso : swicha tra le tre funzioni:
% caso 1 -- manovellismo di spinta
% caso 2 -- quadrilatero articolato
% caso 3 -- guida di fairbairn
var = zeros (1,length(x));
switch caso
case 1
% esercitazione 4 A
var(1) = 0.2*cos(tn(1))+0.6*cos(x(1))-x(2) ;
var(2) =0.2*sin(tn(1))+0.6*sin(x(1)) ;
case 2
% esercitazione 4 B
var(1) = -0.7+0.3*cos(tn)+0.4*cos(x(1))+0.6*cos(x(2)) ;
var(2) = +0.3*sin(tn)+0.4*sin(x(1))+0.6*sin(x(2)) ;
case 3
%esercitazione 4 C - guida di Fairbairn
var(1) = 11.45*cos(tn)+x(1)*cos(x(2)+pi) ;
var(2) = 11.45*sin(tn)+x(1)*sin(x(2)+pi)+45.8 ;
var(3) = 80*cos(x(2))+x(4) ;
var(4) = 80*sin(x(2))+x(3)-100 ;
otherwise
end
end
function [ soluzioni ] = funzPrim ( x , tn , valFunz, caso )
% ESERCITAZIONE 5
%sintazssi : [sol] = funzPrim ( x , tn , valFunz , caso)
%
% derivate prime di funz
%
% x = vettore delle incognite
% tn = termine noto : [ fi2 omega2 ]
% omega2 = velocità angolare della manovella 2
% valFunz = valori trovati nella funz ----> da inizializzare
% soluzioni = valori restituiti
%caso = 1 : manovellismo di spinta
% 2 : quadrilatero articolato
% 3 : guida di fairbairn
switch caso
case 1
soluzioni = zeros(1,2);
% caso 1 : derivate prime di funz
% x = vettore delle incognite : [ omega3 esse_punto ]
omega3 = x(1);
esse_punto = x(2);
% tn = termini noti : [ fi2 omega2 ]
% omega2 = velocità angolare della manovella 2
fi2 = tn(1);
omega2 = tn(2);
% valFunz = valori trovati nella funz : [ fi3 esse theta]
fi3 = valFunz(1);
soluzioni(1) = -esse_punto -.2*omega2*sin(fi2) -.6*omega3*sin(fi3);
soluzioni(2) = 0 +.2*omega2*cos(fi2) +.6*omega3*cos(fi3);
case 2
soluzioni = zeros(1,2);
% caso 2 : derivate prime di funz
% x = vettore delle incognite : [ omega3 omega4 ]
omega3 = x(1);
omega4 = x(2);
% tn = termine noto : [ fi2 omega2 ]
% omega2 = velocità angolare della manovella 2
fi2 = tn(1);
omega2 = tn(2);
% valFunz = valori trovati nella funz : [ fi3 fi4 det(jacobiana) ]
fi3 = valFunz(1);
fi4 = valFunz(2);
soluzioni(1) = -.3*omega2*sin(fi2) -.4*omega3*sin(fi3) -.6*omega4*sin(fi4);
soluzioni(2) = +.3*omega2*cos(fi2) +.4*omega3*cos(fi3) +.6*omega4*cos(fi4);
case 3
soluzioni = zeros(1,4);
% caso 3 : derivate prime di funz
l2 = 11.45 ;
l4 = 80 ;
% x = vettore delle incognite : [ esse_p omega4 yB_p xC_p ]
esse_p = x(1);
omega4 = x(2);
yB_p = x(3);
xC_p = x(4);
% tn = termine noto : [ fi2 omega2 ]
% omega2 = velocità angolare della manovella 2
fi2 = tn(1);
omega2 = tn(2);
% valFunz = valori trovati nella funz : [ esse fi4 yB xC ]
esse = valFunz(1);
fi3 = valFunz(2);
yB = valFunz(3);
xC = valFunz(4);
soluzioni(1) = -l2*omega2*sin(fi2) +esse_p*cos(fi4+pi) -esse*omega4*sin(fi4+pi) ;
soluzioni(2) = +l2*omega2*sin(fi2) +esse_p*sin(fi4+pi) +esse*omega4*cos(fi4+pi) ;
soluzioni(3) = -l4*omega4*sin(fi4) -xC_p ;
soluzioni(4) = +l4*omega4*cos(fi4) +yB_p ;
otherwise
end
function [ Jacob ] = jacob( x , caso )
% legge il vettore incognite <x>
% e crea la matrice jacobiana <Jacob>, di dimensione (length(x),length(x))
% sintassi :
% [Jacob] = jacob ( x , caso )
%
%caso : swicha tra le tre funzioni:
% caso 1 -- manovellismo di spinta
% caso 2 -- quadrilatero articolato
% caso 3 -- guida di fairbairn
Jacob = zeros (length(x),length(x));
switch caso
case 1
% esercizio A
Jacob(1,1) = -0.6*sin(x(1)) ;
Jacob(1,2) = -1 ;
Jacob(2,1) = 0.6*cos(x(1));
Jacob(2,2) = 0 ;
case 2
% esercizio B
Jacob(1,1) = -0.4*sin(x(1)) ;
Jacob(1,2) = -0.6*sin(x(2)) ;
Jacob(2,1) = 0.4*cos(x(1));
Jacob(2,2) = 0.6*cos(x(2)) ;
case 3
% esercizio C - guida di fainberg
% x(1) = spostamento carrello glifo
% x(2) = angolo glifo
% x(3) = posizione su y
% x(4) = posizione su x
Jacob(1,1) = cos(x(2)+pi) ;
Jacob(1,2) = -x(1)*sin(x(2)+pi) ;
Jacob(2,1) = sin(x(2)+pi) ;
Jacob(2,2) = x(1)*cos(x(2)+pi) ;
Jacob(3,2) = -80*sin(x(2)) ;
Jacob(3,4) = 1 ;
Jacob(4,2) = 80*cos(x(2)) ;
Jacob(4,3) = 1 ;
otherwise
end
end
function [ X ] = itera( X0 , Jacob , Funz )
% passo elementare di iterazione
X = X0 - Funz*((inv(Jacob))') ;
end
function [ modul ] = modulo( x )
%ritorna il vettore <modulo>, composto dai moduli dei valori del vettore
%inserito <x>
N = length(x);
modul = zeros(1,N);
for i=1:N
if (x(i)>0)
modul(i) = x(i) ;
else
modul(i) = -x(i) ;
end
end
end
function [ Sol ] = NewRap( x0 , tn, caso )
%calcola il valore degli zeri della funzione studiata
% x0 : vettore valori di inizializzazione delle incognite
% tn : vettore valori termini noti
% caso : swicha tra le tre funzioni:
% caso 1 -- manovellismo di spinta
% caso 2 -- quadrilatero articolato
% caso 3 -- guida di fairbairn
% sintassi :
N = 200;
C = length(x0);
X = zeros (N,C);
X(1,:) = x0 ;
E = ones(1,C)*0.00001;
D = ones(1,C)*0.00001;
Sol = zeros(1,C);
% fprintf ('X0 =') ; printa (X(1,:)) ;
for i = 2:N
% fprintf (' F(%i) = ',i-2) ; printa (funz ( X(i-1,:), tn )) ;
% fprintf (' Jacobiano(%i) =',i-2) ; jacob( X(i-1,:) ) ;
% fprintf (' detJacob(%i) = %f \n',i-2,det(jacob( X(i-1,:) ))) ;
% fprintf ('\n InversaJacob(%i) = ',i-2) ; inv(jacob( X(i-1,:) ))
if (modulo(det(jacob( X(i-1,:),caso)))<1*10^(-6))
fprintf('errore nel determinante');
else
X(i,:) = itera ( X(i-1,:) , jacob(X(i-1,:),caso) , funz(X(i-1,:),tn,caso) );
% fprintf ('X(%i) = ', i-1 ) ; printa (X(i,:));
var1 = modulo(funz(X(i,:),tn,caso))<E ;
var2 = modulo( X(i,:)-X(i-1,:) )<D ;
if ( isequal( var1 & var2 , ones(1,C)) )
Sol = X(i,:);
break
end
end
end
end
function [ Sol ] = NewRap_p( x0 , tn , valFunz , caso )
%calcola il valore degli zeri della funzione studiata
% x0 : vettore valori di inizializzazione delle incognite
% tn : vettore valori termini noti
% valFunz : vettore valori trovati nella funz
% caso : swicha tra le tre funzioni:
% caso 1 -- manovellismo di spinta
% caso 2 -- quadrilatero articolato
% caso 3 -- guida di fairbairn
% sintassi : [ Sol ] = NewRap_p ( x0 , tn , valFunz , caso )
N = 2000;
C = length(x0);
X = zeros (N,C);
X(1,:) = x0 ;
E = ones(1,C)*0.001;
D = ones(1,C)*0.001;
Sol = zeros(1,C);
for i = 2:N
if (modulo(det(jacob( X(i-1,:),caso)))<1*10^(-6))
fprintf('errore nel determinante');
else
X(i,:) = itera ( X(i-1,:) , jacob(X(i-1,:),caso) , funzPrim(X(i-1,:),tn,valFunz,caso) );
var1 = modulo(funzPrim(X(i,:),tn,valFunz,caso))<E ;
var2 = modulo( X(i,:)-X(i-1,:) )<D ;
if ( isequal( var1 & var2 , ones(1,C)) )
Sol = X(i,:);
break
end
end
end
end
function [ Omega2 ] = omega2 ( fi2 )
% questa funzione calcola il valore di omega2 dell'ESERCITAZIONE 5
% SINTASSI: [omega2] = omega2 ( fi2 )
k = 0.012 ;
omega20 = 25 ; % rad/s
Omega2 = omega20*(1+k*sin(fi2)) ;
end
function [ ] = printa( x )
% stampa i valori del vettore x e va a capo
fprintf ('[')
for i = 1 : length(x)
fprintf('\t%f',x(i)) ;
end
fprintf ('\t]\n');
end
function [ a ] = RendiLegg( r , x )
% Rendi Leggibile.
% risolve l'equazione:
% r = a + k*x
%sintassi:
% [a] = RendiLegg ( r , x )
if (length(r)==1)
if ((r<=x/2) && (r>=-x/2))
% if ((r<=x) && (r>=0))
a = r ;
else if (r>0)
a = RendiLegg( r - x , x ) ;
else
a = RendiLegg( r + x , x ) ;
end
end
else
l = length(r) ;
a = zeros (1,l);
for i = 1:l
a(i) = RendiLegg ( r(i) , x ) ;
end
end
end