![]() |
|
#1
|
|||
|
|||
![]() Курсовая по информатике
Аппроксимировать заданную функцию методом Гира. Функция 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
|
|||
|
|||
![]() Если я правильно понял задание, то надо сделать такую штуку, которая спрашивает у пользователя n и x(n+1).
Далее, следуя методу Гира, высчитывает n первых значений, высчитывает коэф. гамма (ну нету на ст. клаве греческих буквиц) "решая" систему линейных уравнений (благо там фактически расчет, т.к. за исключением самих гамм, у тебя есть все значения, просто их надо привести к удобоваримому виду и заложить в программу. Далее по методу гира высчитывает n+1 значение. а вот далее самое интересное. Надо будет нарисовать график функции погрешности от n. Значение погрешности дейтсвительно можно считать напрямую сравнивая экстраполируемое значение со значением исходной функции. Т.е. ты прогоняешь вычисление по Гиру с n от 2 до N, высчитываешь значение погрешности и строишь его график. Я так понял, но рекомедую изложить это на бумаге и подойти к преподу и уточнить - правильно ли ты понял задание. За это не убивают ![]() |
#3
|
|||
|
|||
![]() http://www.muscat.torchok.net/Diff/Kurs.rar
Вывода графиков и таблицы нет Ругается в процессе табуляции функции. Кто разбирается, подскажите где проблема? Последний раз редактировалось Muscat, 03.05.2008 в 15:48. |
#4
|
|||
|
|||
![]() Кто разбирается в методе Гира
Как задать H? http://www.muscat.torchok.net/Diff/Kurs.rar И почему говорит об ошибке с "плавающей точкой"? |
#5
|
|||
|
|||
![]() Проблема уточнилась
Программа не хочет делить на дробное число. Если заменить ту строчку на которую она ругается сейчас - та же ошибка выскакивает на строке где другое деление. Заменил все типы Double на __Real и обозначил в типах _Real как Real - чтобы можно было снова вернуться к дабл. Косяк все тот же. Ссылка на последний вариант http://www.muscat.torchok.net/Diff/Kurs.rar |
#6
|
|||
|
|||
![]() Посмотри в отладке выражение
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
|
|||
|
|||
![]() Огромное спасибо)
Табуляцию функции исправил, теперь табулирование работает нормально. H задал как dU. Все ненулевое Если закомментить в основном блоке все после вывода таблицы значений - то выводит таблицу. Но ошибка все равно вылезает =/ Посмотрите если не сложно) Адрес исправленной программы все там же Последний раз редактировалось Muscat, 04.05.2008 в 01:16. |
#8
|
|||
|
|||
![]() Беда в этом же выражении.
"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
|
|||
|
|||
![]() Спасибо огромное)
Последние вопросы Экстраполяцию считает как надо, проблема с рассчетом погрешности. Эпсилон заданное считывает, эпсилон текущее считает нормально, но в цикле не обрашает внимания что текущее стало меньше заданное - работает максимальное число циклов. И при изучении зависимости погрешности Непонятные скачки при 4 и 9 =/ Хотя абсолютное значение погрешности уменьшается как надо. Ссылка на обновленный вариант все та же) http://www.muscat.torchok.net/Diff/Kurs.rar |
#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
|
|||
|
|||
![]() Извини, в исходниках не хватает Unit2.pas. Без него прога не компилируется.
Заведи себе сайт на narod.ru - будешь существовать без проблем всю оставшуюся жизнь. Последний раз редактировалось san-46, 04.05.2008 в 20:11. |
#12
|
|||
|
|||
![]() http://www.muscat.torchok.net/Diff/Kurs.rar
Перезалил, вопрос все тот же. Проблема с вычислением погрешности =/ |
#13
|
|||
|
|||
![]() И та же проблема: Unit2.pas опять в исходниках нет.
|
#14
|
|||
|
|||
![]() Его там не должно быть )
Попробуйте удалить все скачанное ранее, у меня в папке тоже нет такого файла, в дереве объектов тоже таких не значится, все нормально комплируется... |