Метод Наименьших Квадратов

oRign

Вот первый вариант - рабочий, но! Я не понимаю, почему когда подключаю math, чтобы ввести y[i]:=arcsin(2*x[i]-1) программа перестает работать?
Кликните здесь для просмотра всего текста
program POSLEDNYAYA;
{$APPTYPE CONSOLE}
uses
  SysUtils;
var a,n,n1,i,j,nmax,k:integer;
    h,xsum,ysum,max,s,m,slin,spar,b,skub:real;
    X,y:array[0..10] of real;
    ylin,ykub,ypar:array[0..10] of real;
    alin:array[1..2] of real;
    apar:array[1..3] of real;
    akub:array[1..4] of real;
    matr:array[1..4,1..5] of real;
    buf:array[1..5] of real;
begin
a:=0;
b:=2;
n:=10;
h:=(b-a)/n;
for i := 0 to n do
                begin
                x[i]:=a+i*h;
                 y[i]:=(exp(x[i])-exp(-x[i]))/2;
                end;
       for i:=1 to 2 do
       for j:=1 to 3 do
       matr[i,j]:=0;
matr[1,1]:=n+1;
for i := 0 to n do
                begin
                matr[1,2]:=matr[1,2]+x[i];
                matr[1,3]:=matr[1,3]+y[i];
                matr[2,1]:=matr[2,1]+x[i];
                matr[2,2]:=matr[2,2]+x[i]*x[i];
                matr[2,3]:=matr[2,3]+y[i]*x[i];
                end;
writeln;  
Writeln('Pramaya');
for i := 1 to 2 do
                  begin
                  for j := 1 to 2 do
                      write(matr[i,j]:8:2);
                  writeln('  (  ',   matr[i,3]:2:2,'  )  ');
                  end;
Writeln;
n1:=2;
max:=abs(matr[1,1]);
Nmax:=1;
for i := 2 to n1 do
                begin
                if max < abs(matr[i,1]) then
                                     begin
                                     max:=abs(matr[i,1]);
                                     Nmax:=i;
                                     end;
               end;
if max<>abs(matr[1,1]) then
                    begin
                    for j:=1 to n1+1 do
                                    begin
                                    buf[j]:=matr[Nmax,j];
                                    matr[Nmax,j]:=matr[1,j];
                                    matr[1,j]:=buf[j];
                                    end;
                    end;
for k := 1 to n1-1 do
                  begin
                  for i := k to n1-1 do
                                    begin
                                    m:=matr[i+1,k]/matr[k,k];
                                    for j :=k  to n1+1 do
                                                      begin
                                                      buf[j]:=matr[k,j]*m;
                                                      matr[i+1,j]:=matr[i+1,j]-buf[j];
                                                      end;
                                    end;
                 end;
 
 
alin[n1]:=matr[n1,n1+1]/matr[n1,n1];
for i := n1-1 downto 1 do
                      begin
                      s:=0;
                      for j := i+1 to n1 do
                                        s:=s+matr[i,j]*alin[j];
                      alin[i]:=(matr[i,n1+1]-s)/matr[i,i];
                      end;
for i := 1 to n1 do
 
writeln('a',i-1,'=',alin[i]:2:2);
writeln('y=',alin[2]:2:2,'*x+',alin[1]:2:2);
 writeln('');
 
writeln('Porabola');
   for i := 1 to 3 do
for j := 1 to 4 do
                       matr[i,j]:=0;
 
matr[1,1]:=n+1;
for i := 0 to n do
                begin
                matr[1,2]:=matr[1,2]+x[i];
                matr[1,3]:=matr[1,3]+x[i]*x[i];
                matr[1,4]:=matr[1,4]+y[i];
 
                matr[2,1]:=matr[2,1]+x[i];
                matr[2,2]:=matr[2,2]+x[i]*x[i];
                matr[2,3]:=matr[2,3]+x[i]*x[i]*x[i];
                matr[2,4]:=matr[2,4]+y[i]*x[i];
 
                matr[3,1]:=matr[3,1]+x[i]*x[i];
                matr[3,2]:=matr[3,2]+x[i]*x[i]*x[i];
                matr[3,3]:=matr[3,3]+x[i]*x[i]*x[i]*x[i];
                matr[3,4]:=matr[3,4]+y[i]*x[i]*x[i];
                end;
writeln;
for i := 1 to 3 do
                  begin
                  for j := 1 to 3 do
                                    write(matr[i,j]:8:2);
                  writeln('  (  ',   matr[i,4]:2:2, '  )  '  );
                  end;
 
  Writeln;
 
n1:=3;
max:=abs(matr[1,1]);
Nmax:=1;
for i := 2 to n1 do
                begin
                if max < abs(matr[i,1]) then
                                     begin
                                     max:=abs(matr[i,1]);
                                     Nmax:=i;
                                     end;
               end;
 
if max<>abs(matr[1,1]) then
                    begin
                    for j:=1 to n1+1 do
                                    begin
                                    buf[j]:=matr[Nmax,j];
                                    matr[Nmax,j]:=matr[1,j];
                                    matr[1,j]:=buf[j];
                                    end;
                    end;
 
for k := 1 to n1-1 do
                  begin
                  for i := k to n1-1 do
                                    begin
                                    m:=matr[i+1,k]/matr[k,k];
                                    for j :=k  to n1+1 do
                                                      begin
                                                      buf[j]:=matr[k,j]*m;
                                                      matr[i+1,j]:=matr[i+1,j]-buf[j];
                                                      end;
                                    end;
                 end;
 
apar[n1]:=matr[n1,n1+1]/matr[n1,n1];
for i := n1-1 downto 1 do
                      begin
                      s:=0;
                      for j := i+1 to n1 do
                                        s:=s+matr[i,j]*apar[j];
                      apar[i]:=(matr[i,n1+1]-s)/matr[i,i];
                      end;
for i := 1 to n1 do
writeln('a',i-1,'=',apar[i]:2:2);
writeln('y=',apar[3]:2:2,'*x^2+(',apar[2]:2:2,')*x+(',apar[1]:2:2,')');
Writeln; writeln('');
writeln('Kybichesk');
 
 for i := 1 to 4 do
for j := 1 to 5 do
   matr[i,j]:=0;
matr[1,1]:=n+1;
 
for i := 0 to n do
                begin
                matr[1,2]:=matr[1,2]+x[i];
                matr[1,3]:=matr[1,3]+x[i]*x[i];
                matr[1,4]:=matr[1,4]+x[i]*x[i]*x[i];
                matr[1,5]:=matr[1,5]+y[i];
 
                matr[2,1]:=matr[2,1]+x[i];
                matr[2,2]:=matr[2,2]+x[i]*x[i];
                matr[2,3]:=matr[2,3]+x[i]*x[i]*x[i];
                matr[2,4]:=matr[2,4]+x[i]*x[i]*x[i]*x[i];
                matr[2,5]:=matr[2,5]+y[i]*x[i];
 
                matr[3,1]:=matr[3,1]+x[i]*x[i];
                matr[3,2]:=matr[3,2]+x[i]*x[i]*x[i];
                matr[3,3]:=matr[3,3]+x[i]*x[i]*x[i]*x[i];
                matr[3,4]:=matr[3,4]+x[i]*x[i]*x[i]*x[i]*x[i];
                matr[3,5]:=matr[3,5]+y[i]*x[i]*x[i];
 
                matr[4,1]:=matr[4,1]+x[i]*x[i]*x[i];
                matr[4,2]:=matr[4,2]+x[i]*x[i]*x[i]*x[i];
                matr[4,3]:=matr[4,3]+x[i]*x[i]*x[i]*x[i]*x[i];
                matr[4,4]:=matr[4,4]+x[i]*x[i]*x[i]*x[i]*x[i]*x[i];
                matr[4,5]:=matr[4,5]+y[i]*x[i]*x[i]*x[i];
                end;
 
writeln;
 
for i := 1 to 4 do
                  begin
                  for j := 1 to 4 do
                                    write(matr[i,j]:8:2);
                  writeln('  (  ',   matr[i,5]:2:2, ' ) ');
                  end;
 
  Writeln; Writeln;
 
n1:=4;
max:=abs(matr[1,1]);
Nmax:=1;
for i := 2 to n1 do
                begin
                if max < abs(matr[i,1]) then
                                     begin
                                     max:=abs(matr[i,1]);
                                     Nmax:=i;
                                     end;
               end;
if max<>abs(matr[1,1]) then
                    begin
                    for j:=1 to n1+1 do
                                    begin
                                    buf[j]:=matr[Nmax,j];
                                    matr[Nmax,j]:=matr[1,j];
                                    matr[1,j]:=buf[j];
                                    end;
                    end;
 
for k := 1 to n1-1 do
                  begin
                  for i := k to n1-1 do
                                    begin
                                    m:=matr[i+1,k]/matr[k,k];
                                    for j :=k  to n1+1 do
                                                      begin
                                                      buf[j]:=matr[k,j]*m;
                                                      matr[i+1,j]:=matr[i+1,j]-buf[j];
                                                      end;
                                    end;
                 end;
akub[n1]:=matr[n1,n1+1]/matr[n1,n1];
for i := n1-1 downto 1 do
                      begin
                      s:=0;
                      for j := i+1 to n1 do
                                        s:=s+matr[i,j]*akub[j];
                      akub[i]:=(matr[i,n1+1]-s)/matr[i,i];
                      end;
for i := 1 to n1 do
writeln('a',i-1,'=',akub[i]:2:2);
writeln('y=',akub[4]:2:2,'*x^3+',akub[3]:2:2,'*x^2+(',akub[2]:2:2,')x+',akub[1]:2:2);
 writeln('');
 Writeln;
 
for i := 0 to n do
                begin
                ylin[i]:=alin[1]+alin[2]*x[i];
                ypar[i]:=apar[1]+apar[2]*x[i]+apar[3]*x[i]*x[i];
                ykub[i]:=akub[1]+akub[2]*x[i]+akub[3]*x[i]*x[i]+akub[4]*x[i]*x[i]*x[i];
                end;
write('x':8); write('y':10); write('y(lin)':13); write('y(par)':10); writeln('y(kub)':10);
for i := 0 to n do
                begin
                write(x[i]:10:2);
                write(y[i]:10:2);
                write(ylin[i]:10:2);
                write(ypar[i]:10:2);
                writeln(ykub[i]:10:2);
                end;
 writeln('');
 
writeln('Neviazkie':28);
Writeln;
write('Lineinaia':11); write('Parabola':20); writeln('    Kubicheskaia':11);
 
 for i := 0 to n do
                 begin
                 write(ylin[i]-y[i]:10:5);
                 write(ypar[i]-y[i]:20:5);
                 writeln(ykub[i]-y[i]:14:5);
                 end;
 
 writeln;
 write('Summa: ');
 for i := 0 to n do
                 begin
                 slin:=(ylin[i]-y[i])*(ylin[i]-y[i]);
                 spar:=(ypar[i]-y[i])*(ypar[i]-y[i]);
                 skub:=(ykub[i]-y[i])*(ykub[i]-y[i]);
                 end;
 
 write(slin:5:7);
 write(spar:12:7);
 write(skub:20:7);
 
readln;
end.
3 ответа

oRign

oRign, вместо кода без коментариев напишите лучше поподробней, что именно, в каком месте, как и с какими сообщениями об ошибках "перестаёт работать".


oRign

Короче, как подключаю Math и вписываю формулу арксинус, то при запуске программы она сразу вылетает, но пишет в окне там except.... что именно не успеваю, окно сразу закрывается пауза не помогает.


oRign

oRign, а не надо запускать программу. Программу надо сначала отладить. В отдадчике. Там всё успеете рассмотреть. P.S. А ошибка у вас скорее всего - деление на ноль.