|
Вопрос # 1 516/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Здравствуйте, уважаемые эксперты! У меня программа должна находить собственные числа для матрицы третьего порядка. Сначала я составляю уровнение, это у меня строка похожая например на это:
(2-X)(4-X)(6-)+(3)(5)(3)+(4)(2)(4)-(4)(4-x)(3)-(2-x)(4)(5)-(3)(2)(6-x)=0. Вопрос у меня в том как найти корни к этому уравнению. Их ведь во-первых несколько, точнее три, и они могут быть вещественными. Все корни я собираюсь записать в таблицу, ну это я уже сам сооброжу. Я вас не прошу решать мне задачу, только пожалуйста опишите хотя бы в общих чертах как можно найти корни.
 |
Вопрос задал: Anton (статус: Посетитель)
Вопрос отправлен: 21 апреля 2008, 19:03
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Feniks
Здравствуйте, Anton!
На сколько я помню, решение квадратных уравнений уже падымались тут. Попробуйте поискать поиском на сайте, а так же воспользоваться модулем SqRoot из Приложения.
Приложение: Переключить в обычный режим- unit SqRoot;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, OleCtrls;
-
- type
- TForm1 = class(TForm)
- Edit1: TEdit;
- Edit2: TEdit;
- Edit3: TEdit;
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- Button1: TButton;
- Label5: TLabel;
- Button2: TButton;
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
-
-
- procedure SqRoot(a, b, c: real; var x1, x2: real; var ok: boolean);
-
-
-
-
- var
-
- begin
- d := Sqr(b) - 4 * a * c;
- if d < 0
- then
-
- else
- begin
- ok := True;
- x1 := (-b + Sqrt(d)) / (2 * a);
- x2 := (b + Sqrt(d)) / (2 * a);
- end;
- end;
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
-
-
-
- begin
- SqRoot(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text),
- StrToFloat(Edit3.Text), k1, k2, rez);
- if rez then
-
- 'x1=' + FloatToStrF(k1, ffGeneral, 4, 2) + #13 +
- 'x2=' + FloatToStrF(k2, ffGeneral, 4, 2) + #13
- else
-
-
- label5.Caption := mes;
- end;
-
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- winhelp(Form1.Handle, 'sqroot.hlp', HELP_CONTEXT, 1);
- end;
-
- end.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 21 апреля 2008, 19:35
|
Ответ #2. Отвечает эксперт: Вадим К
Здравствуйте, Anton!
Ну на самом деле не всё так сложно как кажеться на первый взгляд. Если вы получаете это уравнение с матрицы, то записав коэфициенты в виде а11, а12 ... а33 и сделав один раз преобразование к виду
b1*x^3 + b2*x^2+b3*x+b4 =0 (где b1 ... b4 - определённые выражения с a1...a4).
Это может показаться сложноватым, но надо аккуратно обратится. Возможно, нужно будет обратиться к преподавателю математики или товарищам. роботы то на полчаса с проверкой.
Теперь, имея формулы преобразования, вы можете имея матрицу построить кубическое уравнение.
Теперь осталось его решить. Если коэффициент b1 равен 0, то решить просто.
Для кубического немного сложнее, но и тут есть решение, оно просто не входит в стандартный курс ни школьной, ни обычного технического вуза. но если есть формула:), то какие проблемы? читайте здесь http://ru.wikipedia.org/wiki/Кубическое_уравнение
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 21 апреля 2008, 23:54
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 23 апреля 2008, 16:10; участников в обсуждении: 2.
|
Anton (статус: Посетитель), 21 апреля 2008, 20:08 [#1]:
В поиске я то-то не нашел, может где-то не там искал.
Но вообщем вытекает второй вопрос.
Это значит мне сначало все это привести к уравнению третий степени, научить компьютер скобки раскрывать, потом перебором найти первый корень, а уж остальные два это процедурой, которую вы написали?
|
|
Anton (статус: Посетитель), 22 апреля 2008, 17:54 [#2]:
Спасибо, вроде разобрался, упростил. Получил кубическое уравнение.
Теперь знаю как решать вроде. Только подскажите пожалуйста как в Дельфи возвести в куб и взять кубичискей корень из выражения. Может там функции есть специальные, или как то через экспоненту как в паскале помню в степень нужную возводили.
|
|
Вадим К (статус: Академик), 22 апреля 2008, 23:03 [#3]:
ну возвести в куб - это расмешили трижды перемножить.
возвести число в любую положительную степень можно так
x^y = exp(y*ln(x));
но если у вас делфи, то проще можно. Подключаем в uses модуль Math. Теперь появляются функции Power(x,y:real) и intpower(x:real; y:integer). Обе они считают x^y, только вторая возводит в целую степень, благодаря чему работает быстрее и результат будет точным.
Power(2, 10) даст вещественное число, близкое к 1024. Например 1023.9999, так что не удивляйтесь - обычная ситуация. А IntPower(2,10) - будет точно 1024.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Anton (статус: Посетитель), 23 апреля 2008, 16:10 [#4]:
ДА спасибо))) Я уже догодался, просто устал тогда... что-то глупил, глупые вопросы задавл, извините уж) Все равно спасибо, все уже работает, Сдал!)))
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|