Errore punto di intersezione di due rette. find()

di il
2 risposte

Errore punto di intersezione di due rette. find()

Salve, spero il titolo sia adeguato.
sono utente scarso/scarsissimo di Matlab, vi espongo il problema.
faccio prima a scrivervi i comandi che uso per trovare il punto di intersezione di 2 rette:

>> x = 0:.1:1000;
>> y1 = 0.0008*x - 0.0848;
>> y2 = 0.0004*x + 0.2603;
>> find(y1==y2)

dopodichè vorrei usare il comando x("vettore ritornato") per trovare la x di intersezione, ma l'errore che mi risulta dalla procedura è:

ans =

Empty matrix: 1-by-0

non capisco perchè su alcune coppie di equazioni il metodo qui sopra funziona e su altre invece no...

grazie a tutti per il tempo che vorrete dedicarmi

2 Risposte

  • Re: Errore punto di intersezione di due rette. find()

    Hai risolto il problema? se si, puoi dirmi come hai fatto, ne ho uno simile
  • Re: Errore punto di intersezione di due rette. find()

    Il metodo utilizzato funziona solo in casi molto particolari (si potrebbe dire "in casi estremamente fortunati").
    Perchè funzioni è necessario, infatti, che il set di valori scelti per la variabile "X"

    x = 0:.1:1000;

    "contenga il valore dell'ascissa del punto di intersezione (valore della "X" che verifica in sistema delle due equazioni); se ciò accade, i corrispondenti valori calcolati per le "Y" risulteranno uguali (a meno delle approssimazioni del calcolo) e, quindi, la funzione find sarà in grado di trovare il valore cercato.

    Nel caso delle due equazioni riportate nella domanda, la soluzione del sistema di equazioni (od il punto di intersezione delle due rette) è:

    X=862.7500
    Y=0.6054

    purtroppo, il vettore x (definito come "x = 0:.1:1000;") non contiene il valore "862.7500", di conseguenza, i due vettori "y1" e "y2" non conterranno il valore "0.6054" per cui la funzione find produrrà il risultato "Empty matrix: 1-by-0".

    A dimostrazione del fatto che il metodo funziona solo in casi "eccezionali", se il vettore x viene definito come "x = 0:.25:1000;", esso conterrà il valore dell'ascissa del punto di intersezione, tuttavia, il calcolo dei corrispondenti valori di "y1" e "y2" differirà di ""1.1102e-16".
    Questa insignificante differenza impedirà alla funzione find di trovare i valori di "y" che risolvono il sistema di equazioni
    find(x == 862.7500)
    ans =
    3452
    >> y1(3452)
    ans =
    0.6054
    >> y2(3452)
    ans =
    0.6054
    >> y1(3452)-y2(3452)
    ans =
    1.1102e-16
    Per risolvere in modo generale il problema si potrebbe scrivere una funzione che, ricevuti in input i coefficienti che definiscono le due rette, calcoli direttamente il punto di intersezione (cioè che risolva un sistema di due equazioni di primo grado).

    Un esempio di come implementare questa funzione è il seguente:
    
    
    
    function [X, Y]=inters2rette(m1,k1,m2,k2)
    % [X, Y]=inters2retta(m1,k1,m2,k2)
    % Calcola le coordinate del puntio di intersezione di due rette definite
    % come:
    %   retta 1 ==> y=m1*x+k1
    %   retta 2 ==> y=m2*x+k2
    %
    % se le rette non hanno un punto di intersezione ==> X=NaN, Y=NaN
    %
    %
    % ATTENZIONE: BISOGNA INSERIRE OPPORTUNI CONTROLLI SULLA VALIDITA DEGLI
    %             INPUNT
    %
    X=NaN;
    Y=NaN;
    D=(-m1+m2);
    if(D ~= 0)
       X=(k1-k2)/D;
       Y=(-m1*k2+m2*k1)/D;
    end
    
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
2 risposte