[MATLAB] convertire stringa in numerico

m3c4
Salve a tutti.

La mia domanda è questa:
come posso trasformare la stringa seguente (che matlab rileva come Symbolic)
4+((-3).*(t-(-2)))+((1).*(t-(-2)).*(t-(-1)))+((0).*(t-(-2)).*(t-(-1)).*(t-(2)))+((0).*(t-(-2)).*(t-(-1)).*(t-(2)).*(t-(3)))

in un valore da poter calcolare poi applicando un vettore delle x, ovvero
4+((-3).*(t(x)-(-2)))+((1).*(t(x)-(-2)).*(t(x)-(-1)))+((0).*(t(x)-(-2)).*(t(x)-(-1)).*(t(x)-(2)))+((0).*(t(x)-(-2)).*(t(x)-(-1)).*(t(x)-(2)).*(t(x)-(3)))


vorrei che restituisse un valore numerico o vettoriale, piuttosto che una stringa.

Ho gia provato con str2num ma mi da come risultato
[ ]


grazie mille a tutti

Risposte
apatriarca
Potresti spiegare meglio che cosa stai facendo? In che senso la prima stringa la rileva come Symbolic? Che cos'è t? Come compare quella stringa all'interno del codice? Mostra insomma più codice e dai qualche spiegazione più dettagliata su cosa stai cercando di fare.

m3c4
Allora, cerco di spiegarmi meglio!

Si tratta del polinomio interpolante nella forma di Newton.
Praticamente questo programma mi stampa a video il polinomio cercato nei punti x e f(x).
io di questo polinomio vorrei poi valutarlo con il vettore di tabulazione t=[t0,....,tk]
Ma non posso farlo perche la costruzione del polinomio avviene come stringa, ovvero:
%CALCOLO DEL POLINOMIO INTERPOLANTE
    %mi cosruisco la stringa dell'equazione polinomiale che poi andrò a
    %valutare tramite la funzione eval()

    str=[];%base per costruirmi la stringa dell'equazione
    strPoly=[num2str(A(1,2)),'+'];
    %for che mi permette di prendere i C(k) calcolati in precedenza
    for i=2:1:size(A)
        %A(i-1,1) è l'elemento della prima colonna, ovvero del vettore dei
        %punti da cui ho calcolato la f(x) e con i quali andrò a costruire gli
        %w(k)
        str=[str,'.*(t-(',num2str(A(i-1,1)),'))'];
        %A(i,(i+1)) sono proprio i C(k)
        strPoly=[strPoly,'((',num2str(A(i,(i+1))),')',str,')+'];
    end;
    %avendo inserito un '+' di troppo lo elimino con la seguente operazione
    strPoly=strPoly(1,1:end-1);
    poly=strPoly;


percio passare da stringa a funzione su cui poi applicarci il vettore di tabulazione e avere un output numerico mi è un po difficile.
Sto pensando che proprio come ho realizzato il polinomio è sbagliato di principio, o meglio il polinomio è giusto e perfetto, ma come l'ho calcolato...

apatriarca
Credo che la soluzione corretta sarebbe proprio quella di passare da stringa a funzione. Ma creare una stringa non è certamente il modo migliore per rappresentare il polinomio che ti interessa. Una prima soluzione consiste nell'usare il Symbolic Toolbox che ti dovrebbe permettere di lavorare con l'espressione in modo simbolico. Una seconda soluzione (quella che ti consiglio) è di eseguire semplicemente tutte le operazioni che devi senza creare una stringa e lavorando su tutto il vettore di tabulazione in contemporanea (usando quindi tendenzialmente operazioni punto a punto). Perché mai scrivere le operazioni da eseguire in una stringa quando poi valutarle direttamente?

m3c4
bella domanda...!! =) comunque ho risolto!!
VI posto la soluzione direttamente su codice:
function [poly,N] = newtonInterpolante (X,F,t)

%acquisisco i vettori X,F,t rispettivamente vettore delle x, vettore delle
%f(x) e vettore per la valutazione del polinomio interpolante.

%piccolo controllo preliminare sui vettori inseriti dall'utente
if(length(X)~=length(F))
    error('inserire due vettori delle stesse dimensioni');
else
    %costruisco la matrice A partendo dai due vettori X,Y
    A=[X' F'];
    
    %CALCOLO DEI Ck
    %k Ë l'indice del passo di iterazione e serve a calcolare quali elementi
    %della prima colonna andranno a costituire il divisore per il calcolo
    % delle f[x(i),x(i+1)]
    k=1;
    n=length(X);
    for j=3:1:(n+1)
        for i=(j-1):1:n
           A(i,j)=((A(i,j-1))-(A(i-1,j-1)))/(A(i,1)-A(i-k,1));
        end;
        k=k+1;
    end;
    
    
    %CALCOLO DEL POLINOMIO INTERPOLANTE
    %mi cosruisco la stringa dell'equazione polinomiale che poi andrÚ a
    %valutare tramite la funzione eval()

    str=[];%base per costruirmi la stringa dell'equazione
    strPoly=[num2str(A(1,2)),'+'];
    %for che mi permette di prendere i C(k) calcolati in precedenza
    for i=2:1:size(A)
        %A(i-1,1) Ë l'elemento della prima colonna, ovvero del vettore dei
        %punti da cui ho calcolato la f(x) e con i quali andrÚ a costruire gli
        %w(k)
        str=[str,'.*(t-(',num2str(A(i-1,1)),'))'];
        %A(i,(i+1)) sono proprio i C(k)
        strPoly=[strPoly,'((',num2str(A(i,(i+1))),')',str,')+'];
    end;
    %avendo inserito un '+' di troppo lo elimino con la seguente operazione
    strPoly=strPoly(1,1:end-1);
    poly=strPoly;
    
    %calcolo del vettore N(t)
   N=[]; %vettore output
   for j=1:length(t)
      for k=2:size(A)
          o=k;
          while(o>=1)
              if(o==1) break, end
              tmp(o-1)=t(j)-A((o-1),1);
              o=o-1;
          end
          w(k)=A(k,k+1)*prod(tmp);
      end
      N(j)=A(1,2)+sum(w);
      tmp=[];
      w=[];
   end
end


e il test, verificando che il grafico sia proprio $x^2$
disp('script di test per newtonInterpolante con stampa del grafico');

X=[-2 -1 2 3 0]
F=[4 1 4 9 0]

t=-2:0.5:3

[poly,N] = newtonInterpolante(X,F,t)
f=eval(poly);
%evidenzio di blu i punti di partenza, ovvero quelli di coordinate(x,f(x))
plot(X,F,'bo',t,f);

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.