Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.04.2008, 10:09
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию Метод Гира

Курсовая по информатике
Аппроксимировать заданную функцию методом Гира.
Функция

I:=So*p*(1-exp(Uси/p))
p:=Uзи-b*(Uзи)^2

So: 0.02-01
b:= 0.02
Uзи: 5-30
Uси: 0-40

Найти зависимость погрешности от количества учитываемых узлов.
Сделать вывод графиков


Описание работы метода Гира
http://img138.imageshack.us/img138/5591/img008gz2.jpg

Прога на Pascal где реализован этот метод.

Я не прошу написать за меня всю программу целиком, я не могу понять сути задания.
Экстраполяция это отыскание значения функции в узле n+1 если до этого известны n. Поскольку мы рассматриваем ВАX МДП транзюка, то у нас зависимость Тока I jот напряжения Uсток-исток.

Как я понял задание- мы табулировали функцию ( исходную) и получили таблицу значений тока от напряжения 2*N - где N число узлов. Например от 0-30 вольт.
Далее нам надо узнать значение функции в 40 вольтах, или 35, 32.
Далее мы значения из этой таблицы загоняем в матрицу ( по методе) и решаем матричное уравнение, откуда получаем коэфциенты, из которых высчитываем собственно то зеачение которое ищем.
Далее рассчитываем его по исходной формуле, сравниваем и находим погрешность.

Так?
А какие тогда здесь могут быть графики и таблицы значений?
И я так и не понял алгоритм заполнения матрицы.
И как проще всего решать матричное уравнение - в методе LU hразложений так и не разобрался.

Вообщем буду рад, если кто согласится проконсультировать.
По вашему желанию - небезвозмездно =)

Последний раз редактировалось Muscat, 28.04.2008 в 10:17.
Ответить с цитированием
  #2  
Старый 28.04.2008, 16:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Если я правильно понял задание, то надо сделать такую штуку, которая спрашивает у пользователя n и x(n+1).
Далее, следуя методу Гира, высчитывает n первых значений, высчитывает коэф. гамма (ну нету на ст. клаве греческих буквиц) "решая" систему линейных уравнений (благо там фактически расчет, т.к. за исключением самих гамм, у тебя есть все значения, просто их надо привести к удобоваримому виду и заложить в программу.
Далее по методу гира высчитывает n+1 значение.

а вот далее самое интересное.
Надо будет нарисовать график функции погрешности от n.
Значение погрешности дейтсвительно можно считать напрямую сравнивая экстраполируемое значение со значением исходной функции.
Т.е. ты прогоняешь вычисление по Гиру с n от 2 до N, высчитываешь значение погрешности и строишь его график.

Я так понял, но рекомедую изложить это на бумаге и подойти к преподу и уточнить - правильно ли ты понял задание. За это не убивают
Ответить с цитированием
  #3  
Старый 03.05.2008, 14:20
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

http://www.muscat.torchok.net/Diff/Kurs.rar


Вывода графиков и таблицы нет
Ругается в процессе табуляции функции.

Кто разбирается, подскажите где проблема?

Последний раз редактировалось Muscat, 03.05.2008 в 15:48.
Ответить с цитированием
  #4  
Старый 03.05.2008, 16:05
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Кто разбирается в методе Гира
Как задать H?
http://www.muscat.torchok.net/Diff/Kurs.rar
И почему говорит об ошибке с "плавающей точкой"?
Ответить с цитированием
  #5  
Старый 03.05.2008, 17:06
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Проблема уточнилась
Программа не хочет делить на дробное число.
Если заменить ту строчку на которую она ругается сейчас - та же ошибка выскакивает на строке где другое деление.

Заменил все типы Double на __Real и обозначил в типах _Real как Real - чтобы можно было снова вернуться к дабл.
Косяк все тот же.

Ссылка на последний вариант
http://www.muscat.torchok.net/Diff/Kurs.rar
Ответить с цитированием
  #6  
Старый 03.05.2008, 21:28
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Посмотри в отладке выражение
G[I, J]:= exp( (I-1)*Ln((Xpol[n+1] - Xpol[n-(J-1)]) / H) );
В массиве "Xpol" все элементы = 0. А Ln(0) дает ошибку.
"H" тоже равен нулю - значение этой переменной нигде не присваивается. Сам понимаешь, деление на 0 ни к чему хорошему не приводит.

И перегружать стандартные типы в Delphi совсем нет необходимости.
Обозначь все свои переменные Double, и все будет в порядке (выбрось ты эти перегрузки типа: _Real=real;, фигня все это).
Да и тип Real уже не катит - устаревший, оставленный для совместимости. Не хватает Double, применяй Extended (это уже за глаза, практически, для любых вычислений).

Последний раз редактировалось san-46, 03.05.2008 в 21:36.
Ответить с цитированием
  #7  
Старый 04.05.2008, 01:06
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Огромное спасибо)

Табуляцию функции исправил, теперь табулирование работает нормально. H задал как dU. Все ненулевое
Если закомментить в основном блоке все после вывода таблицы значений - то выводит таблицу.

Но ошибка все равно вылезает =/

Посмотрите если не сложно) Адрес исправленной программы все там же

Последний раз редактировалось Muscat, 04.05.2008 в 01:16.
Ответить с цитированием
  #8  
Старый 04.05.2008, 06:26
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Беда в этом же выражении.
"n" всегда равен 10, реальных значений в массиве XPol тоже 10.
Поэтому значение XPol[n+1] равно 0 (n+1 выходит за диапазон реальных значений). Отсюда выражение (Xpol[n+1] - Xpol[n-(J-1)]) на первой итерации принимает значение -40 и опять же отрицательное значение аргумента Ln(-40 / 4) дает ошибку.

Научился бы смотреть значения выражений в отладке. Мне не трудно для тебя ошибки отыскивать, но это не самый эффективный путь, а время то идет - успеешь ли?.
Это не трудно. Устанавливаешь точку прерывания на строке, где происходит ошибка (ctrl+F8).
После остановки на этой точке подводишь мышиный курсор к закрывающей скобке справа, допустим, XPol[n+1], подсказка покаызвает текущее значение. Если надо посмотреть часть выражения, то выделяешь его из всего выражения, например, (Xpol[n+1] - Xpol[n-(J-1)]) и наводишь курсор на выделенный кусок. Опять же подсказка показывает значение выделенной части выражения. Если увидишь в результате слово "NAN" (при захвате в выделенное и функции Ln или Exp), то у функции в этот момент не корректное значение аргумента.

Последний раз редактировалось san-46, 04.05.2008 в 06:40.
Ответить с цитированием
  #9  
Старый 04.05.2008, 13:52
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Спасибо огромное)

Последние вопросы
Экстраполяцию считает как надо, проблема с рассчетом погрешности.
Эпсилон заданное считывает, эпсилон текущее считает нормально, но в цикле не обрашает внимания что текущее стало меньше заданное - работает максимальное число циклов.
И при изучении зависимости погрешности Непонятные скачки при 4 и 9 =/
Хотя абсолютное значение погрешности уменьшается как надо.

Ссылка на обновленный вариант все та же)
http://www.muscat.torchok.net/Diff/Kurs.rar
Ответить с цитированием
  #10  
Старый 04.05.2008, 16:57
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Еще раз со всем разобрался

Задаем нужную точность
Код:
Eps_tek:=StrToFloat(Edit6.text);

После вычисления нового значения экстрполируемой функции сравниваем его с предыдущим и получаем погрешность.

Код:
Eps_pol:=Abs((F_up-F_down)/F_up

Вопрос вот с этой строкой
Код:
Until (eps_tek<eps_pol) or (m+1>n);

Если меняем < на > то программа выключается раньше, но правильно выдалет погрешность.
Если оставляем как есть то опять считает полное число циклов и как то странно рассчитываат погрешность - см график который выдается при исследовательской части.

Последня версия
http://ifolder.ru/6417962

( торчок.нет временно не работает)
Ответить с цитированием
  #11  
Старый 04.05.2008, 20:08
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Извини, в исходниках не хватает Unit2.pas. Без него прога не компилируется.

Заведи себе сайт на narod.ru - будешь существовать без проблем всю оставшуюся жизнь.

Последний раз редактировалось san-46, 04.05.2008 в 20:11.
Ответить с цитированием
  #12  
Старый 05.05.2008, 00:10
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

http://www.muscat.torchok.net/Diff/Kurs.rar

Перезалил, вопрос все тот же. Проблема с вычислением погрешности =/
Ответить с цитированием
  #13  
Старый 05.05.2008, 00:25
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

И та же проблема: Unit2.pas опять в исходниках нет.
Ответить с цитированием
  #14  
Старый 05.05.2008, 01:25
Muscat Muscat вне форума
Прохожий
 
Регистрация: 28.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Его там не должно быть )

Попробуйте удалить все скачанное ранее, у меня в папке тоже нет такого файла, в дереве объектов тоже таких не значится, все нормально комплируется...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:24.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025