Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Anton (статус: Посетитель)
Вопрос отправлен: 21 апреля 2008, 19:03
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Anton!
На сколько я помню, решение квадратных уравнений уже падымались тут. Попробуйте поискать поиском на сайте, а так же воспользоваться модулем SqRoot из Приложения.

Приложение:
  1. unit SqRoot;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, OleCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Edit1: TEdit;
  12. Edit2: TEdit;
  13. Edit3: TEdit;
  14. Label1: TLabel;
  15. Label2: TLabel;
  16. Label3: TLabel;
  17. Label4: TLabel;
  18. Button1: TButton;
  19. Label5: TLabel;
  20. Button2: TButton;
  21. procedure Button1Click(Sender: TObject);
  22. procedure Button2Click(Sender: TObject);
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28.  
  29. var
  30. Form1: TForm1;
  31.  
  32. implementation
  33.  
  34.  
  35.  
  36. procedure SqRoot(a, b, c: real; var x1, x2: real; var ok: boolean);
  37.  
  38.  
  39.  
  40.  
  41. var
  42.  
  43. begin
  44. d := Sqr(b) - 4 * a * c;
  45. if d < 0
  46. then
  47.  
  48. else
  49. begin
  50. ok := True;
  51. x1 := (-b + Sqrt(d)) / (2 * a);
  52. x2 := (b + Sqrt(d)) / (2 * a);
  53. end;
  54. end;
  55. {$R *.dfm}
  56.  
  57. procedure TForm1.Button1Click(Sender: TObject);
  58. var
  59.  
  60.  
  61.  
  62. begin
  63. SqRoot(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text),
  64. StrToFloat(Edit3.Text), k1, k2, rez);
  65. if rez then
  66.  
  67. 'x1=' + FloatToStrF(k1, ffGeneral, 4, 2) + #13 +
  68. 'x2=' + FloatToStrF(k2, ffGeneral, 4, 2) + #13
  69. else
  70.  
  71.  
  72. label5.Caption := mes;
  73. end;
  74.  
  75. procedure TForm1.Button2Click(Sender: TObject);
  76. begin
  77. winhelp(Form1.Handle, 'sqroot.hlp', HELP_CONTEXT, 1);
  78. end;
  79.  
  80. 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

Anton (статус: Посетитель), 21 апреля 2008, 20:08 [#1]:

В поиске я то-то не нашел, может где-то не там искал.

Но вообщем вытекает второй вопрос.
Это значит мне сначало все это привести к уравнению третий степени, научить компьютер скобки раскрывать, потом перебором найти первый корень, а уж остальные два это процедурой, которую вы написали?
Anton

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

Anton (статус: Посетитель), 23 апреля 2008, 16:10 [#4]:

ДА спасибо))) Я уже догодался, просто устал тогда... что-то глупил, глупые вопросы задавл, извините уж) Все равно спасибо, все уже работает, Сдал!)))

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:46
Выполнено за 0.02 сек.