Aiuto programma calcolo numerico
Devo risolvere questo esercizio:
Assegnati i dati (x_0, f_0), (x_1, f_1),..., (x_N, f_N) ed un vettore di punti di tabulazione t=[t_0, t_1, …., t_k], scrivere una function Matlab che calcoli la migliore approssimazione ai dati nel senso dei minimi quadrati e ne fornisca la valutazione nei punti del vettore t. La funzione di migliore approssimazione appartiene allo spazio
V = span{1, cos(x), sin(x), cos(2x), cos(2x)}.
Per l'algoritmo si usi il metodo delle equazioni normali (si veda la routine linsolve).
Adesso io ho creato due function in cui una richiama l'altra.
La prima function è questa:
%Calcolo la matrice dei coefficienti a
function[a]=coeff(x,f)
C=ones(length(x),length(x));%creo la matrice C di dimensioni nxn di tutti 1
if length(f)>= length(x) %voglio fare il controllo sulla lunghezza dei vettori
disp('Attenzione: i vettori devono avere la stessa dimensione') %matlab mi da: One or more output arguments not %assigned during call to 'C:\Documents and Settings\Anto\Desktop\coeff.m (coeff)'. Cosa ho sbagliato? E' normale che faccia questo errore?
else
for j=2:length(x) %dalla seconda colonna
for i=1:length(x) %dalla prima riga
C(i,j)=x(i)^(j-1);
end
end
a=linsolve(C,f'); %calcola la matrice a=C\f'
end
end
La seconda function invece è:
%Calcolo il polinomio interpolante
function
=val1(t,x,f)
[a]=coeff(x,f); %richiamo la function di prima
if length(t)>=length(x) %se la lunghezza di t è < di x non mi cambia niente mi calcola lo stesso p.
for i=1:length(x)
p(i)=a(i)*(sin(t(i))^i); %calcola tanti coefficienti quante sono le componenti di x
end
else
for i=1:length(t)
p(i)=a(i)*(sin(t(i))^i); %calcola tanti coefficienti quante sono le componenti di t
end
end
end
Adesso...perla prima function ho solo quel problema della verifica dei vettori, per il resto funziona.
Il secondo invece mi dà problemi, perchè volendo togliere l'if (che non ha senso) non riesco a far girare il programma. Cosa sbaglio? Lo spazio V è quello che ho scritto o ho sbagliato anche quello?
Pleasssseeeee sono disperata!!!!