echo on
% == Least Squares case uitwerken ==

% De huis prijs grafiek
%     prijs woonoppervlakte, perceel
D = [ 375, 135, 156;
      399, 190,  82;
      349, 145,  85;
      390, 190,  77;
      399, 150, 141;
      349, 160, 132;
    ];
% De formule p = x1 * wo + x2 * po toepassen
A = D(:,2:3)
p = D(:,1)
Ap = [ A p ]
rref(Ap)
% Niets bruikbaars

% De kleinste kwadraten aanpak
AT = A'
ATA = AT * A
ATp = AT * p
ATAp = [ ATA ATp ]
T = rref(ATAp)

%Bepaal nu de geschatte prijzen
x = T(:,3)
pschati = A * x

% In dit model wordt de vraagprijs (x1) zwaarder gewogen en wel
percent = x(2) / x(1) * 100

%pschati prijs wo, po 
[ pschati D ]
% Huizen met een groot po worden fout gemeten
% Voor mijn eigen modelprijs formule ga ik krijgen naar 2de hands
% auto advertenties (van vanderplas.nl in autoplaza leiderdorps dagblad
% woensdag 22 mei 2007)
% Merksterkte heb ik de volgende waardes gegeven
% Mini = 11;
% BMW = 10;
% Audi = 5;
% Fiat = 1;
% prijs, Bouwjaar, Aantal kilometer x1000, aantal deuren, CD, airco
% merksterkte
% speler
Autos = [
  22950, 2003, 113, 5, 1, 1,  5;
  23950, 2004,  64, 5, 1, 1, 10;
  13950, 2001, 116, 3, 0, 1, 10;
  24950, 2003, 102, 5, 0, 1, 10;
  24950, 2002,  47, 2, 1, 1, 10;
   4750, 2001,  54, 3, 1, 0, 1;
  14950, 2005,  39, 3, 1, 1, 1;
  13950, 2002,  86, 3, 1, 1, 11;
  17750, 2003,  55, 3, 1, 1, 11;
  ];

% Ik laat alles even zwaar wegen
A = Autos(:,2:end -1)
p = Autos(:,1)

% De kleinste kwadraten aanpak
AT = A';
ATA = AT * A;
ATp = AT * p;
ATAp = [ ATA ATp ];
T = rref(ATAp);

%Bepaal nu de geschatte prijzen
x = T(:,end);
pschati = A * x;

tp = sum(p);
tsp = sum(pschati);
prijs = [ p pschati ];
for i=1:size(prijs,1)
    prijs(i,3) = prijs(i,2) / prijs(i,1) * 100;
end
% prijs, geschatte prijs
int32(prijs)
total = int32(sum(prijs(:,:)))
%De excessen
min(prijs(:,end)), max(prijs(:,end))
int32( sum(prijs(:,3) / size(prijs,1) ) )

% Dit presteert redelijk, als ik echter de excessen weghaal dan gaat hij
% een stuk beter. Ik zal de auto nader moeten onderzoeken waarom deze
% eruit springt

%
% Olympische 400 meter recordtijden
%

% het script lijn400.m maakt lijnbenadering van de recordtijden als
% functie van olympisch jaar de designmatrix X en waarneemvector y.
% 
% Ik heb een matrix gemaakt van de orginele data en daar een mapping mee
% gemaakt
% zie lijn400.m
lijn400

% Ik neem aan dat de symbolen XT betekenen matrix X getranponeerd.
XT = X';
XTX = XT * X;
XTy = XT * y;
XTXy = [ XTX XTy ];

% inverse
beta = inv(XTX) * XTy
% Reductie
beta = rref(XTXy)
% Matlab \ operator
beta = X\y
% Alle geven dezefde antwoorden, echter wel anders geformateerd

% voor de functie rt400 zie het bestand rt400.m
for i=1:size(X,2)
    rtwaarden_lin(i) = rt400(X(i,2), beta);
end

% plot van de functie
figure;
grid on;
hold on;
plot(X(:,2), y, '*');
plot(X(:,2), rtwaarden_lin, '-r');
hold off;
title('Olympische spelen, mannen 400 meter - lineare plot');
pause
close all hidden;

% voor het maken van de K designmatrix zie kwa400.m
% of gebruik iets als
% K = X;
% K(:,3) = K(:,2) .^ 2;
K = kwa400;
KT = K';
KTK = KT * K;
KTy = KT * y;
KTKy = [ KTK KTy ];

rref(KTKy)
beta = K \ y
% zelfde (maar niet in notatie)

t = 0:38;
rtwaarden_kwa = beta(1) + beta(2) * t + beta(3) * (t .^ 2);

% plot van de functie
figure;
grid on;
hold on;
plot(X(:,2), y, '*');
plot(X(:,2), rtwaarden_lin, '-r');
plot(t, rtwaarden_kwa, '-g');
hold off;
title('Olympische spelen, mannen 400 meter - lineare and kwadratische plot');
pause
close all hidden;

%
% Temperatuurverloop
%

% data invul
clear X;
t_vul;

% rtwaarden bepaling
beta_l = X \ y_l;
beta_h = X \ y_h;

t=0:365;
func_l = beta_l(1) + beta_l(2) * cos(( 2 * pi * t) / 365) + ...
                + beta_l(3) * sin(( 2 * pi * t) / 365);
func_h = beta_h(1) + beta_h(2) * cos(( 2 * pi * t) / 365) + ...
                + beta_h(3) * sin(( 2 * pi * t) / 365);

% plot van de functie
figure;
grid on;
hold on;
plot(orig(:,1), y_l, 'r*');
plot(orig(:,1), y_h, 'g*');
plot(func_l, '-r');
plot(func_h, '-g');
hold off;
axis ([0, 365, 0, 100]);
title('Gemiddelde temperature - kwadratische plot');
pause
close all hidden;



