Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function [coeff,norm2_res]=polminquad(x,y,m)
- % inicialitzem la matriu A
- N = length(x);
- A = ones(N, m + 1);
- for i = 1:N
- for j = 1:m
- A(i, j + 1) = x(i)**j;
- endfor
- endfor
- % calculem les matrius Q i R
- [Q, R] = QR(A);
- % imprimim les normes
- disp(sprintf("1-norm of Q'Q - Id = %e", norm(Q'*Q - eye(m + 1), 1)));
- disp(sprintf("Supremum norm of Q'Q - Id = %e", norm(Q'*Q - eye(m + 1), inf)));
- % fem que y sigui vector columna
- y = y';
- % resolem el sistema R*a = Q'*y
- % que es equivalent al sistema de minims quadrats de A*a = y
- b = Q'*y;
- a = R\b;
- % els coeficients son el vector a en format fila
- coeff = a';
- norm2_res = norm(A*a - y, 2);
- end
- function [Q, R] = QR(A)
- % obtenim les mides
- [n, m] = size(A);
- % inicialitzem les matrius Q i R
- Q = zeros(n, m);
- R = zeros(m, m);
- % iterem sobre les columnes de A
- for i = 1:m
- % guardem a la diagonal de R la norma de la columna iesima de A
- R(i, i) = norm(A(:,i), 2);
- % normalitzem aquesta columna i la guardem a Q
- Q(:, i) = A(:, i)/R(i, i);
- %iterem sobre les columnes mes a la dreta de la que estem
- for j = i+1:m
- % guardem a la part superior de R la projeccio de
- % la columna iesima de Q i la jesima de A
- R(i, j) = dot(Q(:, i), A(:, j));
- % restem de la columna jesima de A aquesta projeccio
- % fent-la ortogonal a la iesima de Q
- A(:, j) = A(:, j) - R(i, j)*Q(:, i);
- endfor
- endfor
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement