Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
гр 106411 Булах С.В..doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

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.