|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Приведение квадратичной формы поверхности к каноническому виду методом Якоби
Здравствуйте. Пытаюсь написать программу, которая приводит уравнение поверхности
к каноническому виду, т.е. к сумме квадратов. Использую метод Якоби, при котором, как я понял, матрица из коэффициентов приводится к треугольному виду. Программа для приведения матрицы к треугольному виду есть: Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, Spin; type TForm1 = class(TForm) StringGrid1: TStringGrid; StringGrid2: TStringGrid; SpinEdit1: TSpinEdit; Label3: TLabel; Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type Tmatrix=array of array of real; var Form1: TForm1; a:Tmatrix; n:integer; implementation {$R *.dfm} //перестановка строк, чтобы исключить, если это возможно //деление на ноль, или число, близкое к нолю procedure Per(k,n:integer;var a:Tmatrix); var j,i,p:integer;z:Real; begin z:=a[k,k];i:=k; //текущая строка for j:=k+1 to n-1 do //ниже ее begin if abs(a[j,k])>z then //ищем в этом столбце максимальный элемент begin z:=a[j,k]; i:=j; end; end; if i>k then //если нашли begin for p:=k to n do //переставляем строки begin z:=a[i,p];a[i,p]:=a[k,p];a[k,p]:=z; end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin n:=SpinEdit1.Value; StringGrid1.ColCount:=n; StringGrid1.RowCount:=n; StringGrid2.ColCount:=n; StringGrid2.RowCount:=n; Showmessage('Введите в таблицу коэффициенты a[i,j]'); end; procedure TForm1.Button2Click(Sender: TObject); var i,j,k:integer; r:real; begin //создание матрицы Setlength(a,n,n); for i:=0 to n-1 do for j:=0 to n-1 do a[i,j]:=StrToFloat(StringGrid1.Cells[j,i]); //преобразование for k:=0 to n-1 do begin Per(k,n,a); //перестановка for j:=k+1 to n-1 do begin r:=a[j,k]/a[k,k]; for i:=k to n-1 do a[j,i]:=a[j,i]-r*a[k,i]; a[j,n]:=a[j,n]-r*a[k,n]; end; end; //вывод результата for i:=0 to n-1 do for j:=0 to n-1 do StringGrid2.Cells[j,i]:=FloatToStrF(a[i,j],ffFixed,6,2); end; end. Вот только есть одно НО: если один из миноров матрицы равен нулю, то нужно делать перенумерацию переменных, а как это задать-не знаю... Например(Ссылка на сайт) [SPOILER]http://mathhelpplanet.com/static.php?p=privedenie-kvadratichnoi-formy-k-kanonicheskomu-vidu[/SPOILER] У матрицы минор второго порядка равен нулю, поэтому там меняют x1<->x3, при этом получаем И диагональные элементы полученной матрицы являются коэффициентами канонического уравнения. Последний раз редактировалось 'Zanuda', 01.06.2014 в 19:21. |
#2
|
|||
|
|||
Если никто не знает, прошу удалить тему.
|
#3
|
||||
|
||||
Вероятно вам нужно перевернуть матрицу, вот примерный проверенный вариант
Код:
... var a: array[0..2] of array[0..2] of real = ((1,1,-1),(1,1,-0.5),(-1,-0.5,1)); //Заполнение грида начальными значениями из массива для проверки procedure TForm1.Button1Click(Sender: TObject); var i, j: integer; begin for i := 0 to 2 do for j := 0 to 2 do StringGrid1.Cells[i, j]:= FloatToStr(a[i,j]); end; procedure TForm1.Button2Click(Sender: TObject); var a1: array[0..2] of array[0..2] of real; i, j: integer; begin // сам переворот с заполнением временного массива for i := 0 to 2 do for j := 0 to 2 do a1[2-i, 2-j]:= a[i, j]; // вывод результата for i := 0 to 2 do for j := 0 to 2 do StringGrid1.Cells[i, j]:= FloatToStr(a1[i, j]); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
'Zanuda' (02.06.2014)
|
#4
|
|||
|
|||
Спасибо за переворот, надеюсь пригодится. Осталось сделать проверку угловых миноров.
|