Московский Авиационный Институт
(Государственный Технический Университет)
Расчетно-графическая работа по информатике
на тему «Табулирование функции»
Москва 2008
Содержание:
Содержание: 2
Задание 3
Анализ задания. 4
Обоснование и описание вычисление корня нелинейного уравнения методом бисекции (половинного деления): 5
Таблица обозначения переменных главной программы. 6
Схемы алгоритмов 7
Главная программа: 7
Функция mfunc: 8
Функция func: 8
Функция sign: 8
Процедура Bisect: 9
Программа Pascal. 10
Результаты. 12
Задание
Разработать схему алгоритма вычисления таблицы значений функции при заданных значениях аргумента Х и параметра А. Параметр В принимает значение, численно равное интегралу.
Аргумент X:
M - число значений аргумента, не зависящих друг от друга;
Параметр А:
An – начальное значение параметра;
Da – шаг изменения параметра;
N – число значений параметра, изменяемого от значения An с шагом Da;
B – корень нелинейного уравнения:
,
вычисленный с погрешностью ?
Табулируемая функция:
Анализ задания.
Составить алгоритм для вычисления таблицы значений функции:
где B - параметр функции, принимающий значение корня нелинейного уравнения:
,
который вычисляется с погрешностью Eps половинного деления.
Bisect - процедура, предназначенная для нахождения значения корня нелинейного уравнения с погрешностью Eps (методом биссекции).
Список входных параметров: c,d, Eps, maxit
c, d - левый и правый пределы отрезка, на котором вычисляется корень; тип - вещ.
Eps - заданная погрешность нахождения корня; тип- вещ.
Maxit - наибольшее разрешенное количество итераций; тип- целое.
Выходные параметры: B
B – корень уравнения; тип вещественные.
k - количество выполненных итераций; тип- целое.
Входными данными в данной задаче являются: M - число значений аргумента, не зависящих друг от друга, M значений Х, An – начальное значение параметра, Da – шаг изменения параметра, N – число значений параметра, изменяемого от значения An с шагом Da;
Для решения нелинейного уравнения методом биссекции (половинного деления) используются следующие параметры: c, d, погрешность вычисления Eps, Maxit - наибольшее разрешенное количество итераций.
Выходными данными в данной задаче являются: значения функции Y, которые зависят от аргумента Х и параметра А, задаваемых пользователем, а также от параметра В, который принимает значение корня нелинейного уравнения.
Стоит учитывать вариант, когда найти решение невозможно. В этом случае надо вывести на экран соответствующее сообщение с указанием ошибки.
Обоснование и описание вычисление корня нелинейного уравнения методом бисекции (половинного деления):
В
общем случае редко удается точно найти
все корни в алгебраических
уравнениях, а если к тому же
коэффициенты в уравнении даны
с погрешностью, то вопрос о
точном определении корней вообще
теряет всякий смысл. Однако если
предположить, что задано
уравнение типа F(x)
= 0,
то тогда без ограничения
общности можно утверждать,
что F(х)
имеет корни, для которых
существует окрестность
,
содержащая только один простой
корень. Такой корень иногда
называют
изолированным.
В результате общая задача
нахождения корней или
нулей функции будет состоять
из следующих этапов:
отделения
корней, т.е. установления
интервала
,
где содержится один и только один
корень уравнения;
задачи уточнения одним из известных методов найденного корня x с заданной погрешностью e.
Предположим теперь, что найден отрезок [а, b] такой, что F(а)F(b) < 0. Тогда, согласно теореме Больцано-Коши, внутри отрезка [а, b] существует точка x, в которой F(x) = 0. Далее необходимо убедиться, что найденная точка x единственная на отрезке [а, b]. Одним из методов является деление отрезка на несколько частей, например на четыре, и проверка на концах каждого из отрезков знака функции.
Нули функции на практике вычисляют приближенно несколькими способами. Одним из самых распространенных можно назвать метод дихотомии (бисекции, половинного деления), относящийся к итерационным. Он состоит в построении последовательности вложенных отрезков, на концах которых F(х) имеет разные знаки. Каждый последующий отрезок получают делением пополам предыдущего. Этот процесс построения последовательности вложенных отрезков позволяет найти нуль функции (F(х) = 0) с любой заданной точностью.
Опишем подробно один шаг итерации. Пусть на k-м шаге найден отрезок [аk , bk], на концах которого F(х) меняет знак. Заметим, что обязательно [аk, bk] ? [а, b]. Разделим теперь отрезок [аk, bk] пополам и выделим F(x), где x - середина [аk , bk]. Здесь возможны два случая: первый, когда F(x) = 0, тогда мы говорим, что корень найден; второй, когда F(x) 0, тогда сравниваем знак F(x) с F(аk) и F(bk) и из двух половин [аk, x] и [x, bk] выбираем ту, на концах которой функция меняет свой знак. Таким образом, аk = а , bk = x, если F(x)F(аk) < 0 , и аk = x , bk = b, если F(x)F(bk) < 0.
При заданной точности e деление пополам продолжают до тех пор, пока длина отрезка не станет меньше 2e, тогда координата середины последнего найденного отрезка и есть значение корня требуемой точности.
Метод дихотомии — простой и надежный метод поиска простого корня уравнения F(х) = 0. Он сходится для любых непрерывных функций F(х), в том числе и недифференцируемых. Недостатки метода:
проблема определения отрезка, на котором функция меняет свой знак (как правило, это отдельная вычислительная задача, наиболее сложная и трудоемкая часть решения);
если корней на выделенном отрезке несколько, то нельзя заранее сказать, к какому из них сойдется процесс;
не применим к корням четной кратности;
для корней нечетной, но высокой кратности метод неустойчив, дает большие ошибки;
медленно сходится. Для достижения e необходимо выполнить N итераций1, т.е. для получения 3 верных цифр (e = 0.0005) надо выполнить около 10 итераций, если отрезок имеет единичную длину.
Программа, по которой можно вычислить корни методом дихотомии, построена по следующему алгоритму:
Определить входные параметры А, В, ЕРS.
Присвоить: А1 ? А; В1 ? В; К ? 0.
Присвоить: Х1 ? А1; Х2 ? В1; К ? К + 1; Х3 ? (В1+А1)/2.
Если F(Х1) F(Х3) < 0, то перейти на шаг 5 иначе на шаг 7.
Присвоить: В1 ? Х3.
Если | А1 - В1| < ЕРS, то перейти на шаг 10 иначе на шаг 3.
Если F(Х2) F(Х3) < 0, то перейти на шаг 8 иначе на шаг 11.
Присвоить: А1 ? Х3.
Перейти на шаг 6.
Печать: Х3 - корень уравнения; К - количество итераций.
| А1 - В1| / 2 - погрешность решения.
Конец программы.
Это наиболее простое решение задачи, но не самое эффективное. Эффективность можно повысить, если:
заменить произведения F(х1)F(х3) и F(х2)F(х3) на использование функции sign(x).
определить процедуру-функцию, вычисляющую F(х) только один раз;
заменить в операторе цикла медленный оператор (А+В)/2 на более быстрый (А+В)*0.5.
Таблица
обозначения переменных
главной
программы.
Обозначение в задании |
Обозначение В алгоритме |
Наименование |
M |
M |
число значений аргумента, не зависящих друг от друга, целый тип |
X |
Х |
Массив аргументов, вещественный тип |
An |
An |
начальное значение параметра, вещественный тип |
Da |
Da |
шаг изменения параметра A, вещественный тип |
N |
N |
число значений параметра, изменяемого от значения An с шагом Da, целый тип |
|
Y |
Значение функции, вещественный тип |
|
maxit |
Наибольшее разрешенное количество итераций; целый тип. |
B |
B |
Значение определенного интеграла, вещественный тип |
? |
Eps |
Заданная погрешность вычисления корня нелинейного уравнения, вещественный тип |
с, d |
c, d |
Левый и правый пределы отрезка, на котором вычисляется корень, вещественный тип |
Схемы алгоритмов
В соответствие с принципами структурного программирования каждый функциональный законченный фрагмент программы оформлен в виде подпрограммы. В результате программа включает главною программу и набор подпрограмм, предназначенных соответственно для вычисления значения функции, вычисления корня нелинейного уравнения.
Главная программа:
Функция mfunc:
Список формальных параметров: x, a, b.
Список входных параметров:
a, b – параметры функции, тип вещественный.
x – аргумент функции, тип вещественный.
Функция func:
Функция sign:
Процедура Bisect:
Программа Pascal.
program RGR;
uses crt;
const c=0; d=8; eps=0.0001;
var b,a,An,Da:real;
x:array [1..100] of real;
i,j,m,n,k,maxit:integer;
function func(x:real):real;
begin
func:=exp(-x)-sqr(x-1);
end;
function mfunc(a,x,b:real):real;
begin
if x>1
then
mfunc:=sqr(x)/(a*x+b)
else
mfunc:=b*exp(a*x);
end;
function sign(x:real):integer;
begin
if x>=0
then
sign:=1
else
sign:=-1;
end;
procedure bisect (c,d,eps:real; maxit:integer; var X:real; var k:integer);
var C1,D1:real; X1,X2,X3:integer;
begin
X1:=sign(func(C));
X2:=sign(func(D));
C1:=C;
D1:=D;
repeat
inc(K);
X:=(C1+D1)*0.5;
X3:=sign(func(X));
if X3=0 then exit;
if abs(D1-C1)<(2*eps) then exit;
if (X1=X2) and (X2=X3) then exit;
if X1=X3
then
begin
C1:=X;
X1:=X3;
end
else
begin
D1:=X;
X2:=X3;
end;
until K>=maxIT;
end;
begin
write('Введите M: ');
readln(m);
for i:=1 to m do
begin
write('Введите x[',i,']: ');
readln(x[i]);
end;
write('Введите максимальное число итераций: ');
readln(maxit);
bisect(c,d,eps,maxit,b,k);
writeln('Проведено итераций: ',k);
writeln('B=',b:5:3);
write('Введите An, Da, N: ');
readln(An,Da,N);
writeln;
writeln('Таблица значений.');
for i:=1 to m do
begin
writeln;
writeln('x=',x[i]:5:3);
writeln;
a:=an;
for j:=1 to n do
begin
writeln(' A=',a:5:3,'; y=',mfunc(a,x[i],b):5:5);
a:=a+da;
end;
end;
readln;
end.
Результаты.
Введите M: 3
Введите x[1]: -1
Введите x[2]: 3
Введите x[3]: 5
Введите максимальное число итераций: 100
Проведено итераций: 17
B=1.478
Введите An, Da, N: 4 3 2
Таблица значений.
х=-1.000
А=4.000; y=0.02707
А=7.000; y=0.00135
х=3.000
А=4.000; y=0.66777
А=7.000; y=0.40040
х=5.000
А=4.000; y=1.16400
А=7.000; y=0.68535
1
Не смотря на то, что все материалы на сайте xies.ru носят ознакомительный характер, наша база однозначно может помочь с написанием дипломных работ или рефератов. Каталок настолько внушительный, что у нас вы точно сможете найти отсортированные по тематикам рефераты и курсовые, а также контрольные работы и дипломы. Для тех кто ищет конспекты, тоже найдётся подходящая информация, которую без труда можно скачать бесплатно. Всё для студентов и школьников, в одной базе рефератов!