|
#1
|
|||
|
|||
Помогите, прошу
Ребят, прошу помощи
Был код, решил немного его подкорректировать (заменил стринг грид на обычный двумерный массив и что-то еще) и забить все в функцию БЫЛО (РАБОТАЛО) Код:
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); // Код:
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]); |
#2
|
||||
|
||||
Клавишу F7 не отменили, прошагай и узнаешь где ошибка. И привыкай к Дельфи. Результирующие результаты удобнее писать Result := "что-то-там", а не, к примеру, sum_stolb := sum. В итоге, первая функция перепишется так:
Код:
// Функция, считающая сумму эллементов в заданном столбце function Sum_stolb(mas : arr; stolbez, n_kon_mas : Integer) : Real; var I : Integer; begin Result := 0; for I := 0 to n_kon_mas - 1 do Result := Result + mas[stolbez, I]; end; // Sum_stolb Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 11.08.2014 в 00:47. |
#3
|
|||
|
|||
просто я не могу видеть текущие значения переменных, тк использую функцию, не знаю почему
|
#4
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
|||
|
|||
ну я совсем новичек, что поделать
|
#6
|
||||
|
||||
Вот и учись. Прочитай про использование клавиш F4, F7, F8 и воспользуйся ими для отладки функции.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
|||
|
|||
В продолжении темы
На сайте http://radiokot.ru/forum/viewtopic.php?f=58&t=101045 нашел рабочий USB вольтметр. Рабочий в том смысле, что работает не только в Протеусе, но и со спаянной схемой. Сама спаянная схема (прошивка) опознается компом без ошибок. Опознается как HID устройство. Но проблема в том, что исходник самой программы написан на VB. Как переделать этот исходник в Delphi - без понятия. Конверторы VB2Delphi ни к чему не привели. На выше указанном сайте полный мертвяк - ни одного ответа. VB код программы в архиве http://yadi.sk/d/gjirEuvQaNoyY. Сама программа работает либо с готовой спаянной схемой, либо с PROTEUSом совместно. Из всей программы меня интересует только вывод вольтов в текстовом окне, остальные навороты в этой программе мне не к чему. Помогите пожалуйста перевести VB в Delphi.
P.S. Советами типа "Вот и учись..." пожалуйста не обременяйтесь. Я не крутой программист. Мне хватает Delphi 5 вполне. А с какой стороны подходить к VB я уже забыл напрочь. |
#8
|
||||
|
||||
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#9
|
|||
|
|||
Пришлось поставить VB. Исходник рабочий, как и сама экзешка. Проверил. Скачал VBto, шараварную, конвертер. Сохранить коды в файлы для Delphi нельзя, т.к. конвертер без патча. Но переписать текст можно. Ввел текст переписанного кодов на Delphi - при запуске Delphi начинает плеваться ошибками. Если конвертер сконвертировал правильно, то такого быть не должно. Есть исходник аналогичной программы на Delphi, но с ранее выложенным устройством (прошивкой в архиве) она не работает. Работает только со своим, а оно (устройство) не опознается компом, работать можно только в PROTEUSе. Вот и мучаюсь - как перетащить нужные коды в дельфийскую программу не знаю.
Вот код на Delphi для второй аналогичной проги http://yadi.sk/d/Nfow-zdcaRGXi. |