Показать сообщение отдельно
  #1  
Старый 11.08.2014, 00:07
painjkee painjkee вне форума
Прохожий
 
Регистрация: 11.08.2014
Сообщения: 3
Версия Delphi: Delphi XE
Репутация: 10
Восклицание Помогите, прошу

Ребят, прошу помощи
Был код, решил немного его подкорректировать (заменил стринг грид на обычный двумерный массив и что-то еще) и забить все в функцию


БЫЛО (РАБОТАЛО)
Код:
VS, US, i, j, k, n, id : integer;
MTX_XY : arr;
sr_kv_otkl : real;

begin

    n:=StringGrid1.RowCount;

//объявляем размер матрицы (всегда один и тот же для любой ОФ от 3 переменных)

    SetLength(MTX_XY, 8, n);

//Считываем данные из таблицы (столбцы X1,X2,Y)
    for i := 0 to 2 do
        for j := 0 to (n-1) do
            MTX_XY[i,j]:=StrtoFloat(StringGrid1.Cells[i, j]);

//добавляем остальные необхиодимые данные в матрицу
// 0 столбец - x1, 1 столбец - x2, 2 столбец - y,3 столбец - x1x1, 4 столбец - x1x2, 5 столбец - x2x2,
// 6 столбец - yx1, 7 столбец - yx2

//переписать в более красивом виде
    for i := 3 to 7 do
        for j := 0 to n-1 do
        begin
            if i=3 then
                MTX_XY[i,j]:=MTX_XY[0,j]*MTX_XY[0,j];
            if i=4 then
                MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[0,j];
            if i=5 then
                MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[1,j];
            if i=6 then
                MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[0,j];
            if i=7 then
                MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[1,j];
        end;

//Из имеющихся данных составляем новую таблицу для решения СЛАУ

        StringGrid2.Cells[0, 0]:=FloatToStr(n);
        StringGrid2.Cells[1, 0]:=FloatToStr(Sum_stolb(MTX_XY,0,n));
        StringGrid2.Cells[2, 0]:=FloatToStr(Sum_stolb(MTX_XY,1,n));
        StringGrid2.Cells[3, 0]:=FloatToStr(Sum_stolb(MTX_XY,2,n));
        StringGrid2.Cells[0, 1]:=StringGrid2.Cells[1, 0];
        StringGrid2.Cells[1, 1]:=FloatToStr(Sum_stolb(MTX_XY,3,n));
        StringGrid2.Cells[2, 1]:=FloatToStr(Sum_stolb(MTX_XY,4,n));
        StringGrid2.Cells[3, 1]:=FloatToStr(Sum_stolb(MTX_XY,6,n));
        StringGrid2.Cells[0, 2]:=StringGrid2.Cells[2, 0];
        StringGrid2.Cells[1, 2]:=StringGrid2.Cells[2, 1];
        StringGrid2.Cells[2, 2]:=FloatToStr(Sum_stolb(MTX_XY,5,n));
        StringGrid2.Cells[3, 2]:=FloatToStr(Sum_stolb(MTX_XY,7,n));

//Решаем СЛАУ (3строки, 3 неизвестных)
//переписать

VS:= 0; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
US:= 1; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
// цикл который выберает следующую вычетаемую строку и повторяет расчет
    for i := 0 to 1 do
     begin
         VS := i; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
// приводим строку которую вычетаем к подходящему виду (должна начинаться с 1)
            for Id := 3 downto 0 do
             begin
                if StrToFloat(StringGrid2.Cells[VS,VS]) = 0 then Break;
                StringGrid2.Cells[Id, VS] :=FloatToStr(StrToFloat(StringGrid2.Cells[Id, VS]) /StrToFloat(StringGrid2.Cells[VS, VS]));
             end;
// цикл который переходит от строки к строке для вычитания начиная снизу
            for j := 2 downto VS + 1 do
             begin
// цикл который вычитает из строки строку по ячейкам справа налево
                US := j; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
                    for k := 3 downto 0 do
                     begin
                        StringGrid2.Cells[k, US] := FloatToStr(StrToFloat(StringGrid2.Cells[k, US]) - (StrToFloat(StringGrid2.Cells[k, VS]) * StrToFloat(StringGrid2.Cells[VS, US])));
                     end;
             end;
     end;
// приводим последнюю строку к подходящему виду (должна начинаеться с 1)
    VS := 2; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    for id := 3 downto 2 do
     begin
        if StrToFloat(StringGrid2.Cells[VS, VS]) = 0 then Break;
        StringGrid2.Cells[Id, VS] :=FloatToStr(StrToFloat(StringGrid2.Cells[Id, VS]) /StrToFloat(StringGrid2.Cells[VS, VS]));
     end;

// находим a2 и выводим на форму
Edit3.Text := StringGrid2.Cells[3, 2];
// находим a1 и выводим на форму
Edit2.Text := FloatToStr(StrToFloat(StringGrid2.Cells[3, 1]) -
(StrToFloat(Edit3.Text) * StrToFloat(StringGrid2.Cells[2, 1])));
// находим a0 и выводим на форму
Edit1.Text := FloatToStr(StrToFloat(StringGrid2.Cells[3, 0]) -
(StrToFloat(Edit3.Text) * StrToFloat(StringGrid2.Cells[2, 0])) -
(StrToFloat(Edit2.Text) * StrToFloat(StringGrid2.Cells[1, 0])));

/////////////////////////////////////////////////////////////////////

//выведем в таблицу полученные значения с помощью ОФ

for j := 0 to n-1 do
StringGrid1.Cells[3,j]:=FloatToStr(StrToFloat(Edit1.Text)
+ StrToFloat(Edit2.Text)* StrToFloat(StringGrid1.Cells[0,j])
+ StrToFloat(Edit3.Text)* StrToFloat(StringGrid1.Cells[1,j]));

//Подсчитаем и выведем среднеквадратическое отклонение
sr_kv_otkl:=0;
for j := 0 to n-1 do
sr_kv_otkl:=sqr(StrToFloat(StringGrid1.Cells[2,j])-StrToFloat(StringGrid1.Cells[3,j]))+sr_kv_otkl;

Edit4.Text:=FloatToStr(sr_kv_otkl);
//

СТАЛО (КОМПИЛИРУЕТСЯ, НО НЕ РАБОТАЕТ (ОШИБКА is not valid floating point value
Код:
procedure TForm1.Button1Click(Sender: TObject);


//2 типа для функций
   type array5 = array[0..5] of real;
   type arr = array of array of real;


//Функция, считающая сумму эллементов в заданном столбце
function Sum_stolb(mas : arr; stolbez, n_kon_mas : integer):real;
   var
     sum:real;
     i:integer;
   begin
     sum:=0;
     for i := 0 to n_kon_mas-1 do
       Sum:=sum+mas[stolbez,i];
     sum_stolb:=sum;
   end;//  Sum_stolb



//МЕТОД НАИМЕНЬШИХ КВАДРАТОВ ДЛЯ ФУНКЦИИ а0+а1*х_i+а2*х_j
function MNK(stolb1,stolb2:integer):array5;
  var
      VS, US, i, j, k, n, id : integer;
      MTX_XY, SLAU : arr;
      a0, a1, a2, sr_kv_otkl : real;
 begin

    n:=StringGrid1.RowCount;

//объявляем размер матрицы (всегда один и тот же для любой ОФ от 3 переменных)
//столбец - x_i, 1 столбец - x_j, 2 столбец - y, 3 столбец - x_i*x_i, 4 столбец - x_i*x_j
// 5 столбец - x_j*x_j, 6 столбец - y*x_i, 7 столбец - y*x_j, 8 столбец - Y по модели

    SetLength(MTX_XY, 9, n);

//объявляем размер матрицы для получения коэф а0,а1,а2
    SetLength(SLAU, 4, 3);


//Считываем данные из таблицы (столбцы STOLB1,STOLB2,Y)

  for j := 0 to n-1 do
    begin
      {stolb1}MTX_XY[0,j]:=StrtoFloat(StringGrid1.Cells[Stolb1, j]);
      {stolb2}MTX_XY[1,j]:=StrtoFloat(StringGrid1.Cells[Stolb2, j]);
           {y}MTX_XY[2,j]:=StrtoFloat(StringGrid1.Cells[n-2, j]);
    end;

//добавляем остальные необхиодимые данные в матрицу

  for i := 3 to 7 do
    for j := 0 to n-1 do
      begin
        if i=3 then
          MTX_XY[i,j]:=MTX_XY[0,j]*MTX_XY[0,j];
        if i=4 then
          MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[0,j];
        if i=5 then
          MTX_XY[i,j]:=MTX_XY[1,j]*MTX_XY[1,j];
        if i=6 then
          MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[0,j];
        if i=7 then
          MTX_XY[i,j]:=MTX_XY[2,j]*MTX_XY[1,j];
      end;

//Из имеющихся данных составляем новую таблицу для решения СЛАУ
    SLAU[0, 0]:=n;
    SLAU[1, 0]:=Sum_stolb(MTX_XY,0,n);
    SLAU[2, 0]:=Sum_stolb(MTX_XY,1,n);
    SLAU[3, 0]:=Sum_stolb(MTX_XY,2,n);
    SLAU[0, 1]:=SLAU[1, 0];
    SLAU[1, 1]:=Sum_stolb(MTX_XY,3,n);
    SLAU[2, 1]:=Sum_stolb(MTX_XY,4,n);
    SLAU[3, 1]:=Sum_stolb(MTX_XY,6,n);
    SLAU[0, 2]:=SLAU[2, 0];
    SLAU[1, 2]:=SLAU[2, 1];
    SLAU[2, 2]:=Sum_stolb(MTX_XY,5,n);
    SLAU[3, 2]:=Sum_stolb(MTX_XY,7,n);




//Решаем СЛАУ (3строки, 3 неизвестных)
//переписать

  VS:= 0; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
  US:= 1; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
// цикл который выберает следующую вычетаемую строку и повторяет расчет
  for i := 0 to 1 do
  begin
    VS := i; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    // приводим строку которую вычетаем к подходящему виду (должна начинаться с 1)
    for Id := 3 downto 0 do
    begin
      if SLAU[VS, VS] = 0 then Break;
        SLAU[Id, VS] := (SLAU[Id, VS] / SLAU[VS, VS]);
    end;
// цикл который переходит от строки к строке для вычитания начиная снизу
    for j := 2 downto VS + 1 do
      begin
// цикл который вычитает из строки строку по ячейкам справа налево
      US := j; // Номер строки из которой вычитают (начиная с 0 (первая строка это 0))
        for k := 3 downto 0 do
          begin
            SLAU[k, US] := (SLAU[k, US] - (SLAU[k, VS] * SLAU[VS, US]));
          end;
      end;
  end;
// приводим последнюю строку к подходящему виду (должна начинаеться с 1)
  VS := 2; // Номер строки которую вычитают (начиная с 0 (первая строка это 0))
    for id := 3 downto 2 do
      begin
        if SLAU[VS, VS] = 0 then Break;
          SLAU[Id, VS] := (SLAU[Id, VS] / SLAU[VS, VS]);
      end;

//СИСТЕМА ПРИВЕДЕНА К ТРЕУГОЛЬНОМУ ВИДУ
//ИЩЕМ И ЗАПОМИНАЕМ РЕШЕНИЕ а0,а1,а2

        a1 := SLAU[3, 2];
        a2 := SLAU[3, 1] - (a2 * SLAU[2, 1]);
        a0 := SLAU[3, 0] - (a2 * SLAU[2, 0]) - (a1 * SLAU[1, 0]);



//Заполняем 8 столбец (у по модели) в матрице МТХ_ХУ для поиска значения ошибки


    for j := 0 to n-1 do
      MTX_XY[8,j]:=a0+a1*MTX_XY[0,j]+a2*MTX_XY[1,j];


//Считаем среднеквадратическое отклонение


   sr_kv_otkl:=0;
   for j := 0 to n-1 do
     sr_kv_otkl:=sqr({y}MTX_XY[2,j]-{y по модели}MTX_XY[8,j])+sr_kv_otkl;


//Записываем все полученные данные в массив MNK
//a0,a1,a2,stolb1,stolb2,sr_kv_otkl

    MNK[0]:=a0;
    MNK[1]:=a1;
    MNK[2]:=a2;
    MNK[3]:=stolb1;
    MNK[4]:=stolb2;
    MNK[5]:=sr_kv_otkl;
 end;



var
 i,j:integer;
 itog:array5;
begin

    itog:=MNK(0,1);
    Edit1.Text:=FloatToStr(itog[0]);
    Edit2.Text:=FloatToStr(itog[1]);
    Edit3.Text:=FloatToStr(itog[2]);
    Edit4.Text:=FloatToStr(itog[5]);
Ответить с цитированием