Помогите, прошу
Ребят, прошу помощи
Был код, решил немного его подкорректировать (заменил стринг грид на обычный двумерный массив и что-то еще) и забить все в функцию
БЫЛО (РАБОТАЛО)
Код:
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]);
|