asmodeus94

regresjaLiniowa

Jan 2nd, 2015
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 14.49 KB | None | 0 0
  1. program regresjaLiniowa;
  2. uses
  3.    crt, dos; {dos dla m.in. fSearch}
  4.  
  5. var
  6.    liczba, xi, yi, xi2, yi2, xiyi, wspA, wspB, nieWspA, nieWspB, kor : real;
  7.    lancuch : string;
  8.    t, t1 : text;
  9.    tX, tY : array [1..1000] of real;
  10.    liczbaElementow : integer;
  11.    kodBledu : integer; {kod bledu dla funkcji (Val) rzutujacej na typ real}
  12.  
  13. procedure stworzPlik(nazwa : string); {jezeli nie istnieja pliki x.txt/y.txt to je tworzy}
  14. begin
  15.    assign(t, nazwa);
  16.    rewrite(t);
  17.    close(t);
  18. end;
  19.  
  20. function formatujLiczbe(liczba : real; nawias : byte) : string; {do wyswietlenia}
  21. var
  22.    a, b, bylo : byte;
  23.    tmp : string;
  24. begin
  25.    Str(liczba:15:15, lancuch);
  26.    bylo := 0;
  27.    b := 0;
  28.    for a := Length(lancuch) downto 1 do
  29.    begin
  30.       if (lancuch[a] <> '0' ) AND (bylo = 0) then
  31.       begin
  32.          bylo := 1;
  33.          if lancuch[a] = '.' then
  34.             continue;
  35.       end;
  36.       if bylo = 1 then begin
  37.          Inc(b);
  38.          if lancuch[a] = '.' then
  39.             lancuch[a] := ',';
  40.          tmp[b] := lancuch[a];
  41.       end;
  42.    end;
  43.    lancuch := '';
  44.    for a := b downto 1 do
  45.       lancuch := lancuch + tmp[a];
  46.    if(liczba < 0) AND (nawias = 1) then
  47.       lancuch := '\left ( ' + lancuch + ' \right )'; {jezeli licxzba jest ujemna, to dajemy ja do nawiasu}
  48.    formatujLiczbe := lancuch;
  49. end;
  50. procedure latexNaglowki;
  51. begin
  52.    append(t);
  53.    writeln(t, '\documentclass[12pt]{article}');
  54.    writeln(t, '\usepackage[utf8]{inputenc}');
  55.    writeln(t, '\usepackage{amsmath}');
  56.    writeln(t, '\usepackage{fancyhdr}');
  57.    writeln(t, '\pagestyle{fancy}');
  58.    writeln(t, '\chead{Regresja liniowa}');
  59.    writeln(t, '\setlength{\parindent}{0mm}');
  60.    writeln(t, '\begin{document}');
  61.    close(t);
  62. end;
  63. procedure renderowanie(co : byte); {drukuje kod wynikowy do wynik.txt}
  64. var
  65.    a : integer;
  66.    dzialanie : array [1..1000] of real;
  67. begin
  68.    append(t);
  69.    case co of
  70.       0:
  71.       begin
  72.          write(t, '\sum_{i=1}^{',liczbaElementow,'}x_{i}=',formatujLiczbe(tX[1], 0));
  73.          for a := 2 to liczbaElementow do
  74.             write(t, '+',formatujLiczbe(tX[a], 1));
  75.          write(t, '=',formatujLiczbe(xi, 0));
  76.          writeln(t, '\\\\');
  77.       end;
  78.       1:
  79.       begin
  80.          write(t, '\sum_{i=1}^{',liczbaElementow,'}y_{i}=',formatujLiczbe(tY[1], 0));
  81.          for a := 2 to liczbaElementow do
  82.             write(t, '+',formatujLiczbe(tY[a], 1));
  83.          write(t, '=',formatujLiczbe(yi, 0));
  84.          writeln(t, '\\\\');
  85.       end;
  86.       2:
  87.       begin
  88.          write(t, '\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}=',formatujLiczbe(tX[1], 1),'^{2}');
  89.          dzialanie[1] := tX[1] * tX[1];
  90.          for a := 2 to liczbaElementow do
  91.          begin
  92.             write(t, '+',formatujLiczbe(tX[a], 1),'^{2}');
  93.             dzialanie[a] := tX[a] * tX[a];
  94.          end;
  95.          write(t, '=',formatujLiczbe(dzialanie[1], 1));
  96.          for a := 2 to liczbaElementow do
  97.          begin
  98.             write(t, '+',formatujLiczbe(dzialanie[a], 1));
  99.          end;
  100.          write(t, '=',formatujLiczbe(xi2, 0));
  101.          writeln(t, '\\\\');
  102.       end;
  103.       3:
  104.       begin
  105.          write(t, '\sum_{i=1}^{',liczbaElementow,'}y_{i}^{2}=',formatujLiczbe(tY[1], 1),'^{2}');
  106.          dzialanie[1] := tY[1] * tY[1];
  107.          for a := 2 to liczbaElementow do
  108.          begin
  109.             write(t, '+',formatujLiczbe(tY[a], 1),'^{2}');
  110.             dzialanie[a] := tY[a] * tY[a];
  111.          end;
  112.          write(t, '=',formatujLiczbe(dzialanie[1], 1));
  113.          for a := 2 to liczbaElementow do
  114.             write(t, '+',formatujLiczbe(dzialanie[a], 1));
  115.          write(t, '=',formatujLiczbe(yi2, 0));
  116.          writeln(t, '\\\\');
  117.       end;
  118.       4:
  119.       begin
  120.          write(t, '\sum_{i=1}^{',liczbaElementow,'}x_{i}y_{i}=',formatujLiczbe(tX[1], 0),'*',formatujLiczbe(tY[1], 1));
  121.          dzialanie[1] := tX[1] * tY[1];
  122.          for a := 2 to liczbaElementow do
  123.          begin
  124.             write(t, '+',formatujLiczbe(tX[a], 1),'*',formatujLiczbe(tY[a], 1));
  125.             dzialanie[a] := tX[a] * tY[a];
  126.          end;
  127.          write(t, '=',formatujLiczbe(dzialanie[1], 1));
  128.          for a := 2 to liczbaElementow do
  129.             write(t, '+',formatujLiczbe(dzialanie[a], 1));
  130.          write(t, '=',formatujLiczbe(xiyi, 0));
  131.          writeln(t, '\\\\');
  132.       end;
  133.       5:
  134.       begin
  135.          write(t, 'a=\frac{',liczbaElementow,'\sum_{i=1}^{',liczbaElementow,'}x_{i}y_{i}-\sum_{i=1}^{',liczbaElementow,'}x_{i}\sum_{i=1}^{',liczbaElementow,'}y_{i}}{',liczbaElementow,'\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}-\left ( \sum_{i=1}^{',liczbaElementow,'}x_{i} \right )^{2}}=');
  136.          write(t, '\frac{',liczbaElementow,'*',formatujLiczbe(xiyi, 1),'-',formatujLiczbe(xi, 1),'*',formatujLiczbe(yi, 1),'}{',liczbaElementow,'*',formatujLiczbe(xi2, 1),'-',formatujLiczbe(xi, 1),'^{2}}=');
  137.          write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi, 0),'-',formatujLiczbe(xi * yi, 1),'}{',formatujLiczbe(liczbaElementow * xi2, 0),'-',formatujLiczbe(xi * xi, 1),'}=');
  138.          write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi - xi * yi, 0),'}{',formatujLiczbe(liczbaElementow * xi2 - xi * xi, 0),'}=',formatujLiczbe(wspA, 0));
  139.          writeln(t, '\\\\');
  140.       end;
  141.       6:
  142.       begin
  143.          write(t, 'b=\frac{\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}\sum_{i=1}^{',liczbaElementow,'}y_{i}-\sum_{i=1}^{',liczbaElementow,'}x_{i}\sum_{i=1}^{',liczbaElementow,'}x_{i}y_{i}}{',liczbaElementow,'\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}-\left ( \sum_{i=1}^{',liczbaElementow,'}x_{i} \right )^{2}}=');
  144.          write(t, '\frac{',formatujLiczbe(xi2, 1),'*',formatujLiczbe(yi, 1),'-',formatujLiczbe(xi, 1),'*',formatujLiczbe(xiyi, 1),'}{',liczbaElementow,'*',formatujLiczbe(xi2, 1),'-',formatujLiczbe(xi, 1),'^{2}}=\\\\');
  145.          write(t, '\frac{',formatujLiczbe(xi2 * yi, 0),'-',formatujLiczbe(xi * xiyi, 1),'}{',formatujLiczbe(liczbaElementow * xi2, 0),'-',formatujLiczbe(xi * xi, 1),'}=');
  146.          write(t, '\frac{',formatujLiczbe(xi2 * yi - xi * xiyi, 0),'}{',formatujLiczbe(liczbaElementow * xi2 - xi * xi, 0),'}=',formatujLiczbe(wspB, 0));
  147.          writeln(t, '\\\\');
  148.       end;
  149.       7:
  150.       begin
  151.          write(t, 'u(a)=\sqrt{\frac{',liczbaElementow,'}{',liczbaElementow,'-2}\frac{\sum_{i=1}^{',liczbaElementow,'}y_{i}^{2}-a\sum_{i=1}^{',liczbaElementow,'}x_{i}y_{i}-b\sum_{i=1}^{',liczbaElementow,'}y_{i}}{',liczbaElementow,'\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}-\left ( \sum_{i=1}^{',liczbaElementow,'}x_{i} \right )^{2}}}=\\\\');
  152.          write(t, '\sqrt{',formatujLiczbe(liczbaElementow / (liczbaElementow - 2), 1),'*\frac{',formatujLiczbe(yi2, 0),'-',formatujLiczbe(wspA, 1),'*',formatujLiczbe(xiyi, 1),'-',formatujLiczbe(wspB, 1),'*',formatujLiczbe(yi, 1),'}{',liczbaElementow,'*',formatujLiczbe(xi2, 1),'-\left ( ',formatujLiczbe(xi, 1),'\right )^{2}}}=\\\\');
  153.          write(t, '\sqrt{',formatujLiczbe(liczbaElementow / (liczbaElementow - 2), 1),'*\frac{',formatujLiczbe(yi2, 0),'-',formatujLiczbe(wspA * xiyi, 1),'-',formatujLiczbe(wspB * yi, 1),'}{',formatujLiczbe(liczbaElementow * xi2, 1),'-',formatujLiczbe(xi * xi, 1),'}}=\\\\');
  154.          write(t, '\sqrt{',formatujLiczbe(liczbaElementow / (liczbaElementow - 2), 1),'*\frac{',formatujLiczbe(yi2 - wspA * xiyi - wspB * yi, 0),'}{',formatujLiczbe(liczbaElementow * xi2 - xi * xi, 0),'}}=\sqrt{',formatujLiczbe((liczbaElementow / (liczbaElementow - 2)) * (yi2 - wspA * xiyi - wspB * yi) / (liczbaElementow * xi2 - xi * xi), 0),'}=\\\\');
  155.          write(t, formatujLiczbe(nieWspA, 0));
  156.          writeln(t, '\\\\');
  157.       end;
  158.       8:
  159.       begin
  160.          write(t, 'u(b)=u(a)\sqrt{\frac{1}{',liczbaElementow,'}\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}}=');
  161.          write(t, formatujLiczbe(nieWspa, 0),'\sqrt{',formatujLiczbe(1 / liczbaElementow, 0),'*',formatujLiczbe(xi2, 0),'}=');
  162.          write(t, formatujLiczbe(nieWspa, 0),'*',formatujLiczbe(sqrt((1 / liczbaElementow) * xi2), 0),'=',formatujLiczbe(nieWspB, 0));
  163.          writeln(t, '\\\\');
  164.       end;
  165.       9:
  166.       begin
  167.          write(t, 'r=\frac{',liczbaElementow,'\sum_{i=1}^{',liczbaElementow,'}x_{i}y_{i}-\sum_{i=1}^{',liczbaElementow,'}x_{i}\sum_{i=1}^{',liczbaElementow,'}y_{i}}{\sqrt{\left [ ',liczbaElementow,'\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}-\left ( \sum_{i=1}^{',liczbaElementow,'}x_{i} \right )^{2} \right ]\left [ ',liczbaElementow,'\sum_{i=1}^{',liczbaElementow,'}y_{i}^{2}-\left ( \sum_{i=1}^{',liczbaElementow,'}y_{i} \right )^2 \right ]}}=\\\\');
  168.          write(t, '\frac{',liczbaElementow,'*',formatujLiczbe(xiyi, 1),'-',formatujLiczbe(xi, 1),'*',formatujLiczbe(yi, 1),'}{\sqrt{\left [ ',liczbaElementow,'*',formatujLiczbe(xi2, 1),'-\left ( ',formatujLiczbe(xi, 1),' \right )^{2} \right ]\left [ ',liczbaElementow,'*',formatujLiczbe(yi2, 1),'-\left ( ',formatujLiczbe(yi, 1),' \right )^2 \right ]}}=\\\\');
  169.          write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi, 0),'-',formatujLiczbe(xi * yi, 1),'}{\sqrt{\left [ ',formatujLiczbe(liczbaElementow * xi2, 0),'-',formatujLiczbe(xi * xi, 1),' \right ]\left [ ',formatujLiczbe(liczbaElementow * yi2, 0),'-',formatujLiczbe(yi * yi, 1),' \right ]}}=\\\\');
  170.          write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi - xi * yi, 0),'}{\sqrt{',formatujLiczbe(liczbaElementow * xi2 - xi * xi, 0),'*',formatujLiczbe(liczbaElementow * yi2 - yi * yi, 1),'}}=');
  171.          write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi - xi * yi, 0),'}{',formatujLiczbe(sqrt((liczbaElementow * xi2 - xi * xi) * (liczbaElementow * yi2 - yi * yi)), 0),'}=',formatujLiczbe(kor, 0));
  172.          writeln(t, '\\\\');
  173.       end;
  174.    end;
  175.    close(t);
  176. end;
  177. procedure obliczanie;
  178. var
  179.    a : integer;
  180. begin
  181.    {dla rendera x1 = 0, yi = 1, xi2 = 2, yi2 = 3, xiyi = 4}
  182.    xi := 0;
  183.    yi := 0;
  184.    xi2 := 0;
  185.    yi2 := 0;
  186.    xiyi := 0;
  187.    assign(t, 'wynik.txt');
  188.    rewrite(t);
  189.    writeln(t, 'Kod w języku LaTeX można skompilować na stronie http://docs.latexlab.org');
  190.    writeln(t, 'Poniżej zostaje zamieszczony kompletny kod gotowy do kompilacji:');
  191.    close(t);
  192.    latexNaglowki;
  193.  
  194.    for a := 1 to liczbaElementow do
  195.    begin
  196.       xi := xi + tX[a]; {sum x(i)}
  197.       yi := yi + tY[a]; {sum y(i)}
  198.       xi2 := xi2 + tX[a] * tX[a]; {sum x(i)2}
  199.       yi2 := yi2 + tY[a] * tY[a]; {sum y(i)2}
  200.       xiyi := xiyi + tX[a] * tY[a]; {sum x(i)y(i)}
  201.    end;
  202.    {przy kazdym odpaleniu rendera osobny append, ze wzgledu na wyrzucenie smieci, jezeli plik jest dlugo otwarty, chuj wie czemu}
  203.    {co ktores odpalenie program i tak sie wywala na samym poczatku, w dokumentacji odnosnie bledu nie ma nic ciekawego...}
  204.    renderowanie(0);
  205.    renderowanie(1);
  206.    renderowanie(2);
  207.    renderowanie(3);
  208.    renderowanie(4);
  209.    {a}
  210.    wspA := (liczbaElementow * xiyi - xi * yi) / (liczbaElementow * xi2 - xi * xi);
  211.    renderowanie(5);
  212.    wspB := (xi2 * yi - xi * xiyi) / (liczbaElementow * xi2 - xi * xi);
  213.    renderowanie(6);
  214.    {7 i 8 dla niepewnosci a i b}
  215.    nieWspA := sqrt((liczbaElementow / (liczbaElementow - 2)) * ((yi2 - wspA * xiyi - wspB * yi) / (liczbaElementow * xi2 - xi * xi)));
  216.    renderowanie(7);
  217.    nieWspB := nieWspA * sqrt((1 / liczbaElementow) * xi2);
  218.    renderowanie(8);
  219.    {9 dla korelacji}
  220.    kor := (liczbaElementow * xiyi - xi * yi)/(sqrt((liczbaElementow * xi2 - xi * xi) * (liczbaElementow * yi2 - yi * yi)));
  221.    renderowanie(9);
  222.  
  223.    append(t);
  224.    write(t, '\end{document}');
  225.    close(t);
  226. end;
  227. function przecinekNaKropke(liczba : string) : string; {przy rzutowaniu zamienia }
  228. var
  229.    a : byte;
  230. begin
  231.    for a := 1 to Length(liczba) do
  232.    begin
  233.       if liczba[a] = ',' then
  234.          liczba[a] := '.';
  235.    end;
  236.    przecinekNaKropke := liczba;
  237. end;
  238. procedure zaladujDaneDoTablic; {ladowanie argumentow i wartosci z plikow x.txt i y.txt}
  239. var
  240.    a : integer;
  241. begin
  242.    a := 0;
  243.    assign(t, 'x.txt');
  244.    assign(t1, 'y.txt');
  245.    reset(t);
  246.    reset(t1);
  247.    REPEAT
  248.       Inc(a);
  249.       readln(t, lancuch);
  250.       lancuch := przecinekNaKropke(lancuch);
  251.       if lancuch = '' then
  252.          continue;
  253.       Val(lancuch, tX[a], kodBledu);
  254.       if kodBledu > 0 then
  255.          break;
  256.       readln(t1, lancuch);
  257.       lancuch := przecinekNaKropke(lancuch);
  258.       if lancuch = '' then
  259.          continue;
  260.       Val(lancuch, tY[a], kodBledu);
  261.       if kodBledu > 0 then
  262.          break;
  263.    UNTIL eof(t);
  264.    close(t);
  265.    close(t1);
  266.    if (a = 1) OR (kodBledu > 0) then
  267.    begin
  268.       write('Sprawdz dane zapisane w plikach x.txt i y.txt');
  269.       readkey;
  270.       halt;
  271.    end;
  272.    liczbaElementow := a;
  273. end;
  274. procedure czekajNaEnter;
  275. var
  276.    z : char;
  277. begin
  278.    REPEAT
  279.       z := readkey;
  280.    UNTIL z=#13;
  281. end;
  282. procedure informacje; {uzywa czekajNaEnter}
  283. begin
  284.    clrscr;
  285.    writeln('Program sluzacy do wyznaczania wspolczynnikow "a" i "b" za pomoca metody regresji liniowej.');
  286.    writeln('Argumenty wkleic do pliku x.txt - jedna linia, jeden argument');
  287.    writeln('Wartosci odpowiadajace kolejnym argumentom wkleic do pliku y.txt - jedna linia, jedna wartosc.');
  288.    writeln('Pamietaj, ze ilosc argumentow i wartosci musi byc taka sama');
  289.    if fSearch('x.txt','') = '' then begin
  290.       stworzPlik('x.txt');
  291.       textbackground(red);
  292.       writeln('Utworzono plik x.txt - wklej do niego argumenty.');
  293.       writeln('Nacisnij klawisz ENTER, aby przejsc dalej.');
  294.       textbackground(0);
  295.       czekajNaEnter;
  296.    end;
  297.    if fSearch('y.txt','') = '' then begin
  298.       stworzPlik('y.txt');
  299.       textbackground(red);
  300.       writeln('Utworzono plik y.txt - wklej do niego watosci.');
  301.       writeln('Nacisnij klawisz ENTER, aby przejsc dalej.');
  302.       textbackground(0);
  303.       czekajNaEnter;
  304.    end;
  305.    textbackground(green);
  306.    writeln('Naciskajac klawisz ENTER zostana wykonane obliczenia!');
  307.    textbackground(0);
  308.    writeln('Do poszczegolnych dzialan jak i koncowego wyniku zostanie wygenerowany kod w jezyku LaTeX.');
  309.    writeln('Jezeli wystapi "Runtime error 6", po prostu jeszcze raz wlacz program i ponownie "przeenteruj" calosc');
  310.    czekajNaEnter;
  311. end;
  312. procedure debugW;
  313. begin
  314.    writeln('sum x(i) = ',formatujLiczbe(xi, 0));
  315.    writeln('sum y(i) = ',formatujLiczbe(yi, 0));
  316.    writeln('sum x(i)^2 = ',formatujLiczbe(xi2, 0));
  317.    writeln('sum y(i)^2 = ',formatujLiczbe(yi2, 0));
  318.    writeln('sum x(i)y(i) = ',formatujLiczbe(xiyi, 0));
  319.    writeln('a = ',formatujLiczbe(wspA, 0));
  320.    writeln('b = ',formatujLiczbe(wspB, 0));
  321.    writeln('u(a) = ',formatujLiczbe(nieWspA, 0));
  322.    writeln('u(b) = ',formatujLiczbe(nieWspB, 0));
  323.    writeln('r = ',formatujLiczbe(kor, 0));
  324.    writeln('Program wykonal obliczenia w sposob prawidlowy, mozesz teraz skopiowac kod z pliku wynik.txt');
  325. end;
  326. begin
  327.    informacje;
  328.    zaladujDaneDoTablic;
  329.    obliczanie; {core}
  330.    debugW;
  331.    readkey;
  332. end.
Advertisement
Add Comment
Please, Sign In to add comment