Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program regresjaLiniowa;
- uses
- crt, dos; {dos dla m.in. fSearch}
- var
- liczba, xi, yi, xi2, yi2, xiyi, wspA, wspB, nieWspA, nieWspB, kor : real;
- lancuch : string;
- t, t1 : text;
- tX, tY : array [1..1000] of real;
- liczbaElementow : integer;
- kodBledu : integer; {kod bledu dla funkcji (Val) rzutujacej na typ real}
- procedure stworzPlik(nazwa : string); {jezeli nie istnieja pliki x.txt/y.txt to je tworzy}
- begin
- assign(t, nazwa);
- rewrite(t);
- close(t);
- end;
- function formatujLiczbe(liczba : real; nawias : byte) : string; {do wyswietlenia}
- var
- a, b, bylo : byte;
- tmp : string;
- begin
- Str(liczba:15:15, lancuch);
- bylo := 0;
- b := 0;
- for a := Length(lancuch) downto 1 do
- begin
- if (lancuch[a] <> '0' ) AND (bylo = 0) then
- begin
- bylo := 1;
- if lancuch[a] = '.' then
- continue;
- end;
- if bylo = 1 then begin
- Inc(b);
- if lancuch[a] = '.' then
- lancuch[a] := ',';
- tmp[b] := lancuch[a];
- end;
- end;
- lancuch := '';
- for a := b downto 1 do
- lancuch := lancuch + tmp[a];
- if(liczba < 0) AND (nawias = 1) then
- lancuch := '\left ( ' + lancuch + ' \right )'; {jezeli licxzba jest ujemna, to dajemy ja do nawiasu}
- formatujLiczbe := lancuch;
- end;
- procedure latexNaglowki;
- begin
- append(t);
- writeln(t, '\documentclass[12pt]{article}');
- writeln(t, '\usepackage[utf8]{inputenc}');
- writeln(t, '\usepackage{amsmath}');
- writeln(t, '\usepackage{fancyhdr}');
- writeln(t, '\pagestyle{fancy}');
- writeln(t, '\chead{Regresja liniowa}');
- writeln(t, '\setlength{\parindent}{0mm}');
- writeln(t, '\begin{document}');
- close(t);
- end;
- procedure renderowanie(co : byte); {drukuje kod wynikowy do wynik.txt}
- var
- a : integer;
- dzialanie : array [1..1000] of real;
- begin
- append(t);
- case co of
- 0:
- begin
- write(t, '\sum_{i=1}^{',liczbaElementow,'}x_{i}=',formatujLiczbe(tX[1], 0));
- for a := 2 to liczbaElementow do
- write(t, '+',formatujLiczbe(tX[a], 1));
- write(t, '=',formatujLiczbe(xi, 0));
- writeln(t, '\\\\');
- end;
- 1:
- begin
- write(t, '\sum_{i=1}^{',liczbaElementow,'}y_{i}=',formatujLiczbe(tY[1], 0));
- for a := 2 to liczbaElementow do
- write(t, '+',formatujLiczbe(tY[a], 1));
- write(t, '=',formatujLiczbe(yi, 0));
- writeln(t, '\\\\');
- end;
- 2:
- begin
- write(t, '\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}=',formatujLiczbe(tX[1], 1),'^{2}');
- dzialanie[1] := tX[1] * tX[1];
- for a := 2 to liczbaElementow do
- begin
- write(t, '+',formatujLiczbe(tX[a], 1),'^{2}');
- dzialanie[a] := tX[a] * tX[a];
- end;
- write(t, '=',formatujLiczbe(dzialanie[1], 1));
- for a := 2 to liczbaElementow do
- begin
- write(t, '+',formatujLiczbe(dzialanie[a], 1));
- end;
- write(t, '=',formatujLiczbe(xi2, 0));
- writeln(t, '\\\\');
- end;
- 3:
- begin
- write(t, '\sum_{i=1}^{',liczbaElementow,'}y_{i}^{2}=',formatujLiczbe(tY[1], 1),'^{2}');
- dzialanie[1] := tY[1] * tY[1];
- for a := 2 to liczbaElementow do
- begin
- write(t, '+',formatujLiczbe(tY[a], 1),'^{2}');
- dzialanie[a] := tY[a] * tY[a];
- end;
- write(t, '=',formatujLiczbe(dzialanie[1], 1));
- for a := 2 to liczbaElementow do
- write(t, '+',formatujLiczbe(dzialanie[a], 1));
- write(t, '=',formatujLiczbe(yi2, 0));
- writeln(t, '\\\\');
- end;
- 4:
- begin
- write(t, '\sum_{i=1}^{',liczbaElementow,'}x_{i}y_{i}=',formatujLiczbe(tX[1], 0),'*',formatujLiczbe(tY[1], 1));
- dzialanie[1] := tX[1] * tY[1];
- for a := 2 to liczbaElementow do
- begin
- write(t, '+',formatujLiczbe(tX[a], 1),'*',formatujLiczbe(tY[a], 1));
- dzialanie[a] := tX[a] * tY[a];
- end;
- write(t, '=',formatujLiczbe(dzialanie[1], 1));
- for a := 2 to liczbaElementow do
- write(t, '+',formatujLiczbe(dzialanie[a], 1));
- write(t, '=',formatujLiczbe(xiyi, 0));
- writeln(t, '\\\\');
- end;
- 5:
- begin
- 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}}=');
- write(t, '\frac{',liczbaElementow,'*',formatujLiczbe(xiyi, 1),'-',formatujLiczbe(xi, 1),'*',formatujLiczbe(yi, 1),'}{',liczbaElementow,'*',formatujLiczbe(xi2, 1),'-',formatujLiczbe(xi, 1),'^{2}}=');
- write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi, 0),'-',formatujLiczbe(xi * yi, 1),'}{',formatujLiczbe(liczbaElementow * xi2, 0),'-',formatujLiczbe(xi * xi, 1),'}=');
- write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi - xi * yi, 0),'}{',formatujLiczbe(liczbaElementow * xi2 - xi * xi, 0),'}=',formatujLiczbe(wspA, 0));
- writeln(t, '\\\\');
- end;
- 6:
- begin
- 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}}=');
- write(t, '\frac{',formatujLiczbe(xi2, 1),'*',formatujLiczbe(yi, 1),'-',formatujLiczbe(xi, 1),'*',formatujLiczbe(xiyi, 1),'}{',liczbaElementow,'*',formatujLiczbe(xi2, 1),'-',formatujLiczbe(xi, 1),'^{2}}=\\\\');
- write(t, '\frac{',formatujLiczbe(xi2 * yi, 0),'-',formatujLiczbe(xi * xiyi, 1),'}{',formatujLiczbe(liczbaElementow * xi2, 0),'-',formatujLiczbe(xi * xi, 1),'}=');
- write(t, '\frac{',formatujLiczbe(xi2 * yi - xi * xiyi, 0),'}{',formatujLiczbe(liczbaElementow * xi2 - xi * xi, 0),'}=',formatujLiczbe(wspB, 0));
- writeln(t, '\\\\');
- end;
- 7:
- begin
- 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}}}=\\\\');
- 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}}}=\\\\');
- 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),'}}=\\\\');
- 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),'}=\\\\');
- write(t, formatujLiczbe(nieWspA, 0));
- writeln(t, '\\\\');
- end;
- 8:
- begin
- write(t, 'u(b)=u(a)\sqrt{\frac{1}{',liczbaElementow,'}\sum_{i=1}^{',liczbaElementow,'}x_{i}^{2}}=');
- write(t, formatujLiczbe(nieWspa, 0),'\sqrt{',formatujLiczbe(1 / liczbaElementow, 0),'*',formatujLiczbe(xi2, 0),'}=');
- write(t, formatujLiczbe(nieWspa, 0),'*',formatujLiczbe(sqrt((1 / liczbaElementow) * xi2), 0),'=',formatujLiczbe(nieWspB, 0));
- writeln(t, '\\\\');
- end;
- 9:
- begin
- 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 ]}}=\\\\');
- 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 ]}}=\\\\');
- 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 ]}}=\\\\');
- write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi - xi * yi, 0),'}{\sqrt{',formatujLiczbe(liczbaElementow * xi2 - xi * xi, 0),'*',formatujLiczbe(liczbaElementow * yi2 - yi * yi, 1),'}}=');
- write(t, '\frac{',formatujLiczbe(liczbaElementow * xiyi - xi * yi, 0),'}{',formatujLiczbe(sqrt((liczbaElementow * xi2 - xi * xi) * (liczbaElementow * yi2 - yi * yi)), 0),'}=',formatujLiczbe(kor, 0));
- writeln(t, '\\\\');
- end;
- end;
- close(t);
- end;
- procedure obliczanie;
- var
- a : integer;
- begin
- {dla rendera x1 = 0, yi = 1, xi2 = 2, yi2 = 3, xiyi = 4}
- xi := 0;
- yi := 0;
- xi2 := 0;
- yi2 := 0;
- xiyi := 0;
- assign(t, 'wynik.txt');
- rewrite(t);
- writeln(t, 'Kod w języku LaTeX można skompilować na stronie http://docs.latexlab.org');
- writeln(t, 'Poniżej zostaje zamieszczony kompletny kod gotowy do kompilacji:');
- close(t);
- latexNaglowki;
- for a := 1 to liczbaElementow do
- begin
- xi := xi + tX[a]; {sum x(i)}
- yi := yi + tY[a]; {sum y(i)}
- xi2 := xi2 + tX[a] * tX[a]; {sum x(i)2}
- yi2 := yi2 + tY[a] * tY[a]; {sum y(i)2}
- xiyi := xiyi + tX[a] * tY[a]; {sum x(i)y(i)}
- end;
- {przy kazdym odpaleniu rendera osobny append, ze wzgledu na wyrzucenie smieci, jezeli plik jest dlugo otwarty, chuj wie czemu}
- {co ktores odpalenie program i tak sie wywala na samym poczatku, w dokumentacji odnosnie bledu nie ma nic ciekawego...}
- renderowanie(0);
- renderowanie(1);
- renderowanie(2);
- renderowanie(3);
- renderowanie(4);
- {a}
- wspA := (liczbaElementow * xiyi - xi * yi) / (liczbaElementow * xi2 - xi * xi);
- renderowanie(5);
- wspB := (xi2 * yi - xi * xiyi) / (liczbaElementow * xi2 - xi * xi);
- renderowanie(6);
- {7 i 8 dla niepewnosci a i b}
- nieWspA := sqrt((liczbaElementow / (liczbaElementow - 2)) * ((yi2 - wspA * xiyi - wspB * yi) / (liczbaElementow * xi2 - xi * xi)));
- renderowanie(7);
- nieWspB := nieWspA * sqrt((1 / liczbaElementow) * xi2);
- renderowanie(8);
- {9 dla korelacji}
- kor := (liczbaElementow * xiyi - xi * yi)/(sqrt((liczbaElementow * xi2 - xi * xi) * (liczbaElementow * yi2 - yi * yi)));
- renderowanie(9);
- append(t);
- write(t, '\end{document}');
- close(t);
- end;
- function przecinekNaKropke(liczba : string) : string; {przy rzutowaniu zamienia }
- var
- a : byte;
- begin
- for a := 1 to Length(liczba) do
- begin
- if liczba[a] = ',' then
- liczba[a] := '.';
- end;
- przecinekNaKropke := liczba;
- end;
- procedure zaladujDaneDoTablic; {ladowanie argumentow i wartosci z plikow x.txt i y.txt}
- var
- a : integer;
- begin
- a := 0;
- assign(t, 'x.txt');
- assign(t1, 'y.txt');
- reset(t);
- reset(t1);
- REPEAT
- Inc(a);
- readln(t, lancuch);
- lancuch := przecinekNaKropke(lancuch);
- if lancuch = '' then
- continue;
- Val(lancuch, tX[a], kodBledu);
- if kodBledu > 0 then
- break;
- readln(t1, lancuch);
- lancuch := przecinekNaKropke(lancuch);
- if lancuch = '' then
- continue;
- Val(lancuch, tY[a], kodBledu);
- if kodBledu > 0 then
- break;
- UNTIL eof(t);
- close(t);
- close(t1);
- if (a = 1) OR (kodBledu > 0) then
- begin
- write('Sprawdz dane zapisane w plikach x.txt i y.txt');
- readkey;
- halt;
- end;
- liczbaElementow := a;
- end;
- procedure czekajNaEnter;
- var
- z : char;
- begin
- REPEAT
- z := readkey;
- UNTIL z=#13;
- end;
- procedure informacje; {uzywa czekajNaEnter}
- begin
- clrscr;
- writeln('Program sluzacy do wyznaczania wspolczynnikow "a" i "b" za pomoca metody regresji liniowej.');
- writeln('Argumenty wkleic do pliku x.txt - jedna linia, jeden argument');
- writeln('Wartosci odpowiadajace kolejnym argumentom wkleic do pliku y.txt - jedna linia, jedna wartosc.');
- writeln('Pamietaj, ze ilosc argumentow i wartosci musi byc taka sama');
- if fSearch('x.txt','') = '' then begin
- stworzPlik('x.txt');
- textbackground(red);
- writeln('Utworzono plik x.txt - wklej do niego argumenty.');
- writeln('Nacisnij klawisz ENTER, aby przejsc dalej.');
- textbackground(0);
- czekajNaEnter;
- end;
- if fSearch('y.txt','') = '' then begin
- stworzPlik('y.txt');
- textbackground(red);
- writeln('Utworzono plik y.txt - wklej do niego watosci.');
- writeln('Nacisnij klawisz ENTER, aby przejsc dalej.');
- textbackground(0);
- czekajNaEnter;
- end;
- textbackground(green);
- writeln('Naciskajac klawisz ENTER zostana wykonane obliczenia!');
- textbackground(0);
- writeln('Do poszczegolnych dzialan jak i koncowego wyniku zostanie wygenerowany kod w jezyku LaTeX.');
- writeln('Jezeli wystapi "Runtime error 6", po prostu jeszcze raz wlacz program i ponownie "przeenteruj" calosc');
- czekajNaEnter;
- end;
- procedure debugW;
- begin
- writeln('sum x(i) = ',formatujLiczbe(xi, 0));
- writeln('sum y(i) = ',formatujLiczbe(yi, 0));
- writeln('sum x(i)^2 = ',formatujLiczbe(xi2, 0));
- writeln('sum y(i)^2 = ',formatujLiczbe(yi2, 0));
- writeln('sum x(i)y(i) = ',formatujLiczbe(xiyi, 0));
- writeln('a = ',formatujLiczbe(wspA, 0));
- writeln('b = ',formatujLiczbe(wspB, 0));
- writeln('u(a) = ',formatujLiczbe(nieWspA, 0));
- writeln('u(b) = ',formatujLiczbe(nieWspB, 0));
- writeln('r = ',formatujLiczbe(kor, 0));
- writeln('Program wykonal obliczenia w sposob prawidlowy, mozesz teraz skopiowac kod z pliku wynik.txt');
- end;
- begin
- informacje;
- zaladujDaneDoTablic;
- obliczanie; {core}
- debugW;
- readkey;
- end.
Advertisement
Add Comment
Please, Sign In to add comment