intersezione in matlab

Messaggioda yader » 10/07/2010, 09:04

Salve a tutti, devo disegnare in matlab due funzioni, \( \displaystyle {y}_{{1}}={{x}}^{{2}} \) e \( \displaystyle {y}{2}={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:
[i]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[/i]

Questo codice funziona con le due funzioni precedenti....Tuttavia se sostituisco \( \displaystyle {y}_{{1}} \) con \( \displaystyle {y}_{{1}}={2}{{x}}^{{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
yader
New Member
New Member
 
Messaggi: 84
Iscritto il: 03/07/2008, 11:47

Messaggioda dissonance » 10/07/2010, 09:34

Come hai fatto a determinare i punti di intersezione, controllando uno a uno tutti i valori? Non è un buon sistema, anche uno scarto di \( \displaystyle {0.1}{{E}}^{{-{52}}} \), dovuto ad errori di arrotondamento, ti falsa il risultato. Meglio usare un metodo numerico per equazioni non lineari, direi. Prova la function "fzero":
Codice: Seleziona tutto
help fzero
Avatar utente
dissonance
Moderatore
Moderatore
 
Messaggi: 9907
Iscritto il: 24/05/2008, 19:39
Località: Bari

Messaggioda yader » 10/07/2010, 10:47

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é...
yader
New Member
New Member
 
Messaggi: 84
Iscritto il: 03/07/2008, 11:47

Messaggioda dissonance » 10/07/2010, 10:55

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 (\( \displaystyle = \)) non esiste.

P.S.: Una maniera rough'n'ready per migliorare il tuo algoritmo è quella di aggiungere un parametro in ingresso, che chiamiamo \( \displaystyle \text{tol} \) (tolleranza), e invece di controllare che
Codice: Seleziona tutto
y1(i) == y2(i)

controllare che
Codice: Seleziona tutto
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 \( \displaystyle \text{tol} \). Occorrerà poi sperimentare con diversi passi di discretizzazione e diversi valori di \( \displaystyle \text{tol} \) affinché la routine dia il risultato sperato.
Ultima modifica di dissonance il 10/07/2010, 11:06, modificato 2 volte in totale.
Avatar utente
dissonance
Moderatore
Moderatore
 
Messaggi: 9907
Iscritto il: 24/05/2008, 19:39
Località: Bari

Messaggioda yader » 10/07/2010, 11:04

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
yader
New Member
New Member
 
Messaggi: 84
Iscritto il: 03/07/2008, 11:47

Messaggioda dissonance » 10/07/2010, 11:05

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.
Avatar utente
dissonance
Moderatore
Moderatore
 
Messaggi: 9907
Iscritto il: 24/05/2008, 19:39
Località: Bari

Messaggioda yader » 10/07/2010, 11:15

L'idea mi sembra ottima..provo immadiatamente!!!!Grazie 1000 ancora
yader
New Member
New Member
 
Messaggi: 84
Iscritto il: 03/07/2008, 11:47

Messaggioda yader » 10/07/2010, 11:44

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
yader
New Member
New Member
 
Messaggi: 84
Iscritto il: 03/07/2008, 11:47

Messaggioda dissonance » 10/07/2010, 12:27

E' chiaro che hai questo inconveniente. Tieni presente che il valore di \( \displaystyle \text{tol} \) andrà adattato a seconda del problema: prova a disegnare le intersezioni di \( \displaystyle {{x}}^{{{1000}}} \) e \( \displaystyle {0} \) in un intorno di \( \displaystyle {0} \) e vedi che scherzo ti fa la tolleranza \( \displaystyle {0.005} \). In questo caso devi drasticamente ridurne il valore.
Avatar utente
dissonance
Moderatore
Moderatore
 
Messaggi: 9907
Iscritto il: 24/05/2008, 19:39
Località: Bari


Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti