- •Министерство образования республики беларусь
- •Кафедра «тэс»
- •По дисциплине “Информатика”
- •1. Выбор и обоснование методов решения.
- •1.1 Метод Ньютона.
- •Заданная функция производная функция
- •2.3 Схема алгоритма основной программы.
- •2.4 Компоновка программы пользователя и распечатка листинга программы.
- •1.2 Схема Горнера.
- •2. Разработка схем алгоритмов основной программы и подпрограмм.
- •2.1 Таблица имён переменных.
- •2.2 Схемы алгоритмов подпрограмм
- •3. Результат расчета.
- •3.1 Распечатка исходных величин.
- •3.2 Распечатка вычисленных величин.
- •Список используемых источников
1.2 Схема Горнера.
Существует много методов для решения полиномов на языке PASCAL. Один из этих методов – разложение полинома по схеме Горнера.
Полином
f(x) = a0 + a1t + + a2t2+ a3t3+ a4t4+ … + antn
по схеме Горнера представляется в виде
f(x) = a0 + t(a1 + t(a2 +t(a3 +… + t(an-1 + t an)…)))
Данное разложение полинома удобно тем, что в нём отсутствует возведение в степень, что значительно ускоряет вычисление полинома.
2. Разработка схем алгоритмов основной программы и подпрограмм.
2.1 Таблица имён переменных.
Иден. |
Наименование |
i |
Счётчик |
p, q, g, k, m |
Коэффициенты временной функции |
fi1, fi2 |
Углы для вычисления коэффициентов q и g |
t |
Время |
t0, tkon, tkv |
Время: начальное, конечное, квантования |
a, b, c |
Коэффициенты квадратного уравнения |
z1, z2 |
Корни квадратного уравнения |
x0 |
Начальное приближение |
eps |
Точность вычисления корня |
x, xpred |
Последующее и предыдущее приближение корня |
s |
Переменная для преобразования числа в строку |
GrDriver, GrMode, ErrCode |
Переменные для инициализации графического режима |
xn, yn |
Координаты начала осей координат |
hx, hy |
Длина единицы по осям Ox, Oy соответственно |
nx, ny |
Количество единиц по осям |
htabl |
Высота таблицы (в зависимости от количества строчек) |
* Примечание.
В подпрограммах к идентификаторам данных переменных добавляется буква f.
2.2 Схемы алгоритмов подпрограмм
Функция решения квадратного уравнения:
нет да
Решение нелинейного уравнения
Заданная функция производная функция
Само решение нелинейного уравнения
да нет
Преобразование числа в Временная функция
с
троку
2.3 Схема алгоритма основной программы.
Н
ет да
да нет
2.4 Компоновка программы пользователя и распечатка листинга программы.
{Программу разработал студент группы 106420 Подолинский Евгений Олегович}
Program kursovoy;
uses crt, graph;
var
i :byte; {счётчик}
vib :byte; {Для диалога}
a, b, c, m :real; {для квадратного уравнения}
k, eps, x0 :real; {для нелинейного уравнения}
p, q, g :real; {коэффициенты временной функции}
fi1, fi2 :byte; {углы для коэф-ов q и g}
t, t0, tkon, tkv :real; {для функции}
{переменные построения графика}
grDriver :Integer;
grMode :Integer;
ErrCode :Integer;
xn, yn, hx, hy, nx, ny :word; {для графика}
htabl :word;
{*************** решение квадратного уравнения ***************}
function kvadrat(af,bf,cf: real):real;
var z1, z2 :real;
begin
z1:= (-bf + sqrt(bf*bf - 4*af*cf))/(2*af);
z2:= (-bf - sqrt(bf*bf - 4*af*cf))/(2*af);
if abs(z1)>abs(z2) then kvadrat:=z2 else kvadrat:= z1;
end;
{*************************************************************}
{*************** решение нелинейного уравнения ***************}
function nelin(x0, eps:real):real;
var x, xpred :real;
function f(w:real):real; {Заданная функция}
begin
f:= exp(-w) - w;
end;
function fpr(v:real):real; {Её производная}
begin
fpr:= - exp(-v) - 1;
end;
begin
x:= x0;
repeat
begin
xpred:=x;
x:= xpred - f(xpred)/fpr(xpred);
end;
until (f(x)<eps) and (abs(x-xpred)< eps);
nelin:= x;
end;
{*************************************************************}
{************ выполняет преобразование числа в строку ********}
function stro(inp:real):string;
var s :string[6];
begin
str(inp:5:3,s);
stro := S;
end;
{*************************************************************}
{***************** собственно то что надо ********************}
function ft(pf,qf,gf,kf,mf,tf:real):real;
begin
ft:=kf + mf + tf*(gf + tf*(qf + pf*tf));
end;
{*************************************************************}
BEGIN
{**************** Решаем квадратное уравнение ***************}
clrscr;
textcolor(7);
Writeln('Решаем квадратное уравнение az2 + bz + c = 0 ');
repeat
begin
Writeln('Введите коэффициенты a,b и c ... ');
write('a= '); readln(a);
write('b= '); readln(b);
write('c= '); readln(c);
if (b*b - 4*a*c) < 0 then
begin
clrscr;
Writeln('Заданное уравнение не имеет действительных корней, повторите ввод...');
end;
end;
until (b*b - 4*a*c) >= 0;
m:= kvadrat(a,b,c);
Writeln('Наименьший корень уравнения m= ',m:4:2);
Write('Для продолжения нажмите "ENTER"'); readln;
{**************** Решаем нелинейное уравнение ***************}
clrscr;
Writeln('Решаем нелинейное уравнение x=e^(-x) методом Ньютона ');
Write('Вводим начальное значение x0 = '); readln(x0);
Write('Вводим точность расчёта E = '); readln(eps);
k:= nelin(x0,eps);
Writeln('Корень уравнения x=e^(-x) x= ',k:6:4);
Write('Для продолжения нажмите "ENTER"'); readln;
{************** подготовака к построению графика *************}
clrscr;
Writeln('Сейчас происходит подготовка к построению графика');
Writeln('временной функции pt^3 + qt^2 + gt + k + m ,где ');
Writeln(' k - корень уранения x=e^(-x) ');
Writeln(' m - меньший по модулю корень уравнения az^2 + bz + c = 0 .');
Writeln('Ввод недостающих коэффициентов:');
Write('Введите p; p = '); readln(p);
Write('q=cos(fi1); введите fi1 (в градусах); fi1 = '); readln(fi1);
q:=cos(fi1);
Write('g=sin(fi2); введите fi2 (в градусах); fi2 = '); readln(fi2);
g:=cos(fi2);
Writeln('');
Writeln('Ввод параметров функции:');
Write('Введите начальное время t0; t0 = '); readln(t0);
Write('Введите конечное время tkon; tkon = '); readln(tkon);
Write('Введите время квантования tkv; tkv = '); readln(tkv);
Writeln('');
Writeln('В каком времени рассчитывать функцию?');
Writeln(' 1 - если в машинном ');
Writeln(' 2 - если в реальном ');
readln(vib);
Write('Для поcтроения графика всё готово. Нажмите "ENTER"'); readln;
{*-*-*-*-*-*-*-*-*-* начинается графика *-*-*-*-*-*-*-*-*-*-*-*}
grDriver := Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
if ErrCode <> grOk then
begin
Writeln('Graphics error:', GraphErrorMsg(ErrCode));
readln;
halt;
end;
{*********** рисование сетки и осей **************************}
xn:= 20; {начало осей координат}
yn:= GetMaxY - 40;
hx:= 18; {величина единицы по x-ам}
hy:= 10; {величина единицы по y-ам}
nx:= 16; {кол-во единиц по x-ам}
ny:= 40; {кол-во единиц по y-ам}
setcolor(14);
MoveTo(1,1);
lineto(GetMaxX-6, 1);
lineto(GetMaxX-6,GetMaxY-4);
lineto(1,GetMaxY-4);
lineto(1,1);
setcolor(8);
for i:=0 to nx do
begin
line(xn + i*hx, yn - hy*ny ,xn + i*hx, yn); {сеть по вертик}
end;
for i:= 0 to ny do
begin
line(xn, yn - hy*ny + i*hy,xn + hx*nx, yn - hy*ny + i*hy); {сеть по гориз}
end;
setcolor(15);
OutTextXY(xn - 7, yn-10, 'O');
Line(xn, yn - hy*ny - 10, xn, yn + 10); {Oy}
line(xn, yn - hy*ny - 10, xn - 2, yn - hy*ny);
line(xn, yn - hy*ny - 10, xn + 2, yn - hy*ny);
OutTextXY(xn - 10, yn - hy*ny - 10,'Y');
Line(xn - 5, yn, xn + hx*nx + 10, yn); {Ox}
line(xn + hx*nx + 10, yn, xn + hx*nx, yn + 2);
line(xn + hx*nx + 10, yn, xn + hx*nx, yn - 2);
OutTextXY(xn + hx*nx + 2, yn - 17,'X');
{надписи}
OutTextXY(340, 20, 'Расчёт временной функции ');
OutTextXY(340, 30, 'pt^3 + qt^2 + gt + k + m ,где ');
OutTextXY(340, 40, ' k - корень уранения x=e^(-x)');
OutTextXY(340, 50, ' m - наименьший по модулю корень');
OutTextXY(340, 60, ' уравнения az^2 + bz + c = 0.');
OutTextXY(340, 90, 'Начальное время t0 = '+stro(t0));
OutTextXY(340, 100, 'Конечное время tkon = ' + stro(tkon));
OutTextXY(340, 110, 'Время квантования tkv = ' + stro(tkv));
OutTextXY(340, 130, ' Значение t значение f(t)');
{рамка}
setcolor(15);
MoveTo(355,125);
LineTo(590,125);
LineTo(590,125 + 45 + 10*trunc(((tkon-t0)/tkv)));
LineTo(355,125 + 45 + 10*trunc(((tkon-t0)/tkv)));
LineTo(355,125);
Line(355,145,590,145);
Line(475,125,475,125 + 45 + 10*trunc((tkon-t0)/tkv));
{рисование графика }
t:=t0;
i:=0;
while t <= tkon do
begin
setcolor(15);
OutTextXY(385,150 + i*10, stro(t));
OutTextXY(505,150 + i*10, stro(ft(p,q,g,k,m,t)));
setcolor(2);
Line(xn+round((t-tkv)*hx),yn-(hy*round(ft(p,q,g,k,m,t-tkv))div 100),xn+round(t*hx),yn-(hy*round(ft(p,q,g,k,m,t))div 100));
if vib = 2 then delay(58000);
t:= t + tkv; i:= i+1;
end;
{типа логотип! :) }
setcolor(8);
OutTextXY(10, 455,'При возникновенни вопросов или предложений, обрщайтесь к разработчику.');
OutTextXY(10, 463,'Наш адрес: г.Минск ул.Сурганова 37/5 общежитие 9 к.903(а).');
repeat begin
setcolor(3);
OutTextXY(340, 430,'Разаработчик: студент группы 106420 ');
OutTextXY(340, 440,' Подолинский Е. О. ');
delay(50000);
setcolor(6);
OutTextXY(340, 430,'Разаработчик: студент группы 106420 ');
OutTextXY(340, 440,' Подолинский Е. О. ');
delay(50000);
end;
until keypressed;
CloseGraph;
END.
