Intersezione in matlab
Salve a tutti, devo disegnare in matlab due funzioni, $y_1=x^2$ e $y2=x$ e devo segnare con un cerchietto i punti di intersezione tra queste due funzioni...
A risolvere l'esercizio ci sono riuscito.Posto il codice:
function out = plot2()
%plot2 disegna la funzione esponenziale y=x^2
% e la funzione bisettrice degli assi,
% evidenziando i punti di intersezione
% e gli assi cartesiani
x=-3:0.001:3
assex=-3:0.1:3;
assey=-2:0.2:5;
y1=x.^3;
y2=x;
cont=0;
intX=[];
intY=[];
for i=1:length(y1)
if y1(i) == y2(i)
cont=cont+1;
intX(cont)=(x(i));
intY(cont)=y1(i);
%disp(y1(i));
%disp(x(i));
end
end
plot(x,y1,'-y',intX,intY,'o');
hold on
plot(x,y2,'-r');
hold on
plot(assex,0,'-k');
hold on
plot(0,assey,'-k');
hold off
axis ([-3 3 -2 5]);% [xmin xmax ymin ymax]
xlabel('asse x'); %etichetta per l'asse x
ylabel('asse y'); %etichetta per l'asse y
end
Questo codice funziona con le due funzioni precedenti....Tuttavia se sostituisco $y_1$ con $y_1=2x^2 - 1$ i grafici delle funzioni vengono disegnate, ma i punti di intersezione no....Ho aumentato il numero di punti per la rappresentazione delle funzioni ma il problema non si risolve...Penso ci vorrebbe un modo per cerchiare "approssimaticamente" i punti di intersezione
Non sono un esperto di Matlab poichè ho iniziato da poco ma presumo che il problema sia questo
Grazie a chi mi aiuta
A risolvere l'esercizio ci sono riuscito.Posto il codice:
function out = plot2()
%plot2 disegna la funzione esponenziale y=x^2
% e la funzione bisettrice degli assi,
% evidenziando i punti di intersezione
% e gli assi cartesiani
x=-3:0.001:3
assex=-3:0.1:3;
assey=-2:0.2:5;
y1=x.^3;
y2=x;
cont=0;
intX=[];
intY=[];
for i=1:length(y1)
if y1(i) == y2(i)
cont=cont+1;
intX(cont)=(x(i));
intY(cont)=y1(i);
%disp(y1(i));
%disp(x(i));
end
end
plot(x,y1,'-y',intX,intY,'o');
hold on
plot(x,y2,'-r');
hold on
plot(assex,0,'-k');
hold on
plot(0,assey,'-k');
hold off
axis ([-3 3 -2 5]);% [xmin xmax ymin ymax]
xlabel('asse x'); %etichetta per l'asse x
ylabel('asse y'); %etichetta per l'asse y
end
Questo codice funziona con le due funzioni precedenti....Tuttavia se sostituisco $y_1$ con $y_1=2x^2 - 1$ i grafici delle funzioni vengono disegnate, ma i punti di intersezione no....Ho aumentato il numero di punti per la rappresentazione delle funzioni ma il problema non si risolve...Penso ci vorrebbe un modo per cerchiare "approssimaticamente" i punti di intersezione
Non sono un esperto di Matlab poichè ho iniziato da poco ma presumo che il problema sia questo
Grazie a chi mi aiuta
Risposte
Come hai fatto a determinare i punti di intersezione, controllando uno a uno tutti i valori? Non è un buon sistema, anche uno scarto di $0.1E^{-52}$, dovuto ad errori di arrotondamento, ti falsa il risultato. Meglio usare un metodo numerico per equazioni non lineari, direi. Prova la function "fzero":
help fzero
sinceramente non ho ancora affrontato le equazioni non lineari e già mi è stato posto un esercizio del genere...Penso che il testo presuppone un calcolo "a mano" dei punti di intersezione (metodo classico per tracciare il grafico di una funzione) e una volta trovati si danno come parametro al plot...Io ho pensato invece ad un metodo che li trovasse da sé...
Ah capisco. Ma purtroppo non è così semplice: come hai potuto constatare MATLAB opera sempre discretizzando gli intervalli, ovvero sostituendoli con insiemi finiti, per quanto fitti, di punti. Affinché la tua routine riesca a pescare un punto di intersezione questo deve necessariamente essere un punto dell'intervallo discretizzato e come sai questa è una roulette, niente ti garantisce che possa accadere; come se non bastasse, i valori assunti dalle tue funzioni sono calcolati in aritmetica finita e perciò sono affetti da errori che possono ulteriormente falsare il risultato.
A me piace vederla così: nel calcolo numerico, l'uguale ($=$) non esiste.
P.S.: Una maniera rough'n'ready per migliorare il tuo algoritmo è quella di aggiungere un parametro in ingresso, che chiamiamo $"tol"$ (tolleranza), e invece di controllare che
controllare che
ovvero, un punto dell'intervallo discretizzato è di intersezione non se si verifica l'uguaglianza esatta ma se la distanza tra le due funzioni è più piccola di $"tol"$. Occorrerà poi sperimentare con diversi passi di discretizzazione e diversi valori di $"tol"$ affinché la routine dia il risultato sperato.
A me piace vederla così: nel calcolo numerico, l'uguale ($=$) non esiste.
P.S.: Una maniera rough'n'ready per migliorare il tuo algoritmo è quella di aggiungere un parametro in ingresso, che chiamiamo $"tol"$ (tolleranza), e invece di controllare che
y1(i) == y2(i)
controllare che
abs( y1(i)-y2(i) ) < tol
ovvero, un punto dell'intervallo discretizzato è di intersezione non se si verifica l'uguaglianza esatta ma se la distanza tra le due funzioni è più piccola di $"tol"$. Occorrerà poi sperimentare con diversi passi di discretizzazione e diversi valori di $"tol"$ affinché la routine dia il risultato sperato.
Grazie per le tue precise delucidazioni...Io a impatto ho pensato che una funzione del genere potesse funzionare...Ritornando alla funzione fzero che mi suggerivi, ho modificato il for del mio codice così:
for i=1:length(x)
if fzero(y1 , x(i)) == fzero (y2 , x(i))
disp(fzero(y1 , x(i)));
end
end
ma di dà questo errore:
??? Error using ==> fzero at 181
FUN must be a function, a valid string expression, or an inline function object.
Error in ==> plot2 at 15
if fzero(y1 , x(i)) == fzero (y2 , x(i))
----------------------------------------------------------------------------------------
a quanto ho capito y1 e y2 non sono riconosciute come 2 funzioni....Ma allora questa FUN cui il metodo si riferisce è la funzione intesa come m-files????Forse sono fuori strada...... :-k
for i=1:length(x)
if fzero(y1 , x(i)) == fzero (y2 , x(i))
disp(fzero(y1 , x(i)));
end
end
ma di dà questo errore:
??? Error using ==> fzero at 181
FUN must be a function, a valid string expression, or an inline function object.
Error in ==> plot2 at 15
if fzero(y1 , x(i)) == fzero (y2 , x(i))
----------------------------------------------------------------------------------------
a quanto ho capito y1 e y2 non sono riconosciute come 2 funzioni....Ma allora questa FUN cui il metodo si riferisce è la funzione intesa come m-files????Forse sono fuori strada...... :-k
Guarda, yader, ho modificato il messaggio precedente suggerendo una miglioria per il tuo algoritmo che non usa fzero. Lascia stare fzero a quando studierai i metodi numerici per equazioni non lineari.
L'idea mi sembra ottima..provo immadiatamente!!!!Grazie 1000 ancora
Ho provato a tracciare diverse funzione e con tol=0.005 funziona....è verò che in certi casi, in prossiità del punto di intersezione possono esserci più di un cerchietto a evidenziare il punto (si nota, anche se minimamente, che il cerchietto ha il bordo più spesso)...
Grazie 1000 dissonance per il suggerimento
Grazie 1000 dissonance per il suggerimento
E' chiaro che hai questo inconveniente. Tieni presente che il valore di $"tol"$ andrà adattato a seconda del problema: prova a disegnare le intersezioni di $x^{1000}$ e $0$ in un intorno di $0$ e vedi che scherzo ti fa la tolleranza $0.005$. In questo caso devi drasticamente ridurne il valore.