Вычислить собственные значения матрицы и вектор, Прямым методом |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Вычислить собственные значения матрицы и вектор, Прямым методом |
Shmaniche |
11.04.2013 12:16
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
Задали написать програму вычисления собственных значений матрицы (можно еще и вектора) прямым методом. Поясните пожалуйста, что это за метод такой? Вот этот или нет? У меня есть исходники метода Якоби. Он подойдет в качестве прямого или нет?
|
Shmaniche |
12.04.2013 9:26
Сообщение
#2
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
В одной книжке нашел код программы, которая как раз вычисляет собственные значения матрицы прямым ходом. Но она не компилируется, компилятор ругается на строку «procedure Secant(var x0, x, e: real; function F:real);», а именно на «function F:real». Подскажите где что пропущено.
Свою процедуру вывода я закомментировал, оставил все как учебнике за исключением своей процедуры ввода матрицы. Полный код:
|
Федосеев Павел |
14.04.2013 18:13
Сообщение
#3
|
Бывалый Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: 8 |
Думаю, что нужно объявить тип
Код type TFuncReal=function (x: real): real; И использовать этот тип при описании функции Код procedure Secant(var x0, x, e: real; F: TFuncReal); |
Shmaniche |
14.04.2013 18:45
Сообщение
#4
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
Думаю, что нужно объявить тип Код type TFuncReal=function (x: real): real; И использовать этот тип при описании функции Код procedure Secant(var x0, x, e: real; F: TFuncReal); В таком случае компилятор ругается на строчку
Недопустимая процедура или фукнция. |
Федосеев Павел |
14.04.2013 18:58
Сообщение
#5
|
Бывалый Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: 8 |
Читаем главу "Procedural types":
Цитата From this example, the difference with Turbo Pascal is clear: In Turbo Pascal it isn’t necessary to use the address operator (@) when assigning a procedural type variable, whereas in Free Pascal it is required. In case the -MDelphi or -MTP switches are used, the address operator can be dropped. Или, в данном случае Код Secant(x0,x,e,@F); |
Shmaniche |
16.04.2013 15:33
Сообщение
#6
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
|
Shmaniche |
17.04.2013 9:46
Сообщение
#7
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
Похоже, что «function F:real» в строке «procedure Secant(var x0, x, e: real; function F:real);» вовсе и не нужна, она уже объявлена выше, также в строке «Secant(x0,x,e,F);» убрать F. Тогда все компилируется.
|
IUnknown |
17.04.2013 10:52
Сообщение
#8
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Цитата Тогда все компилируется И в итоге получается слабая тень той программы, которая была написана в книге. Потому что основная цель программы, приведенной в посте №2 - это вызов Secant с ЛЮБОЙ функцией, которая передается в качестве параметра. А то, что получилось у тебя - это тупой вызов вышеописанной функции, строго заданной, и ТОЛЬКО ОДНОЙ. Работать, возможно, будет, но только... О гибкости программы, приведенной в книге здесь и речи уже не идет.А вообще, по правилам хорошего тона, надо в первом посте указывать, какой у тебя компилятор, а не устраивать тут филиал форума гадалок на кофейной гуще. Хотя о чем это я... Тебе что говори, что нет. Были прецеденты. Всё равно сделаешь по своему, еще и все виноватыми окажутся... |
Shmaniche |
17.04.2013 18:44
Сообщение
#9
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
IUnknown
Компилирую в Турбо Паскале 7.0, ест-но. А что толку? Все равно же не скажите как правильно исправить процедуру?! Ой, зануда... Да еще и злопамятный видать! Я вооще забыл о чем мы тогда спорили. Добавлено через 12 мин. Меня еще пара вопросов интереует. Строки
предназначены для ввода размера матрицы ”n”, два начальных приближения ”x0”, ”x” к одному из собственных значений матрицы и допустимую погрешность решения характеристического уравнения ”e”. Собственно, что это за начальные приближения ”x0”, ”x”? Охота разобраться. Для удобства ввода этих параметров я изменил эти две строки на такие:
Сообщение отредактировано: Shmaniche - 17.04.2013 19:00 |
Shmaniche |
18.04.2013 8:16
Сообщение
#10
|
Пионер Группа: Пользователи Сообщений: 79 Пол: Мужской Репутация: 0 |
Короче, раз некоторые здесь страдают манией величия и пальцем не пошевелят, чтобы помочь студенту, конечно приходиться перебирать варианты самому . Вот нашел подходящий пример:
Метод секущих для решения трансцендентного уравнения f(x) = 0. x, x0 – два начальных приближения, e - оценка точности получаемого решения, итерационный процесс прекращается при приближении f(x) к нулю меньше, чем на e, x – искомый корень.
Источник Объявление функции в строке "procedure secant(var x0, x: real; e: real);" тут даже и не пахнет! Сообщение отредактировано: Shmaniche - 18.04.2013 8:21 |
Текстовая версия | 29.04.2024 9:08 |