2.1. Листинг программы.
Вводимые значения.
A – номер студента по списку группы B – последняя цифра номера группы
1) Заданы узловые значения
Xi = sin (13 *i +3*i*i)*5 + 3*i/(i+2)
Р-73 Yi = (3+3)*cos(3*i +3*13*i*i ) + 13*3/(13+3), i =1..10
Аргумент и значение функции Лагранжа.
X |
Y |
-0.440 |
0.038 |
2.982 |
3.676 |
1.667 |
0.735 |
-0.532 |
3.467 |
7.044 |
-3.093 |
-0.760 |
-0.060 |
-1.115 |
-3.544 |
5.584 |
7.859 |
7.249 |
7.904 |
4.439 |
-3.510 |
uses
CRT, Graph; {подключаем модули CRT, Graph}
var
x, y :array[1..10] of real; {объявляем массив для узлов интерполяции и их значений}
z,z1:real;{точное и приблизительное значение интеграла}
x_1,x1,x2,x3,x4,y1,y2:real; {координаты}
sx,sy,sxx,sxy:real; {значения сумм при выполнении аппроксимации}
m:real; {масштаб}
h:real; {шаг}
e:real; {погрешность}
n:real; {кол-во разбиений}
с:real; {коэффициент}
a,b,a1,a2,b1:real; {координаты}
s:real; {значение многочлена Лагранжа}
p:real;
tempY,tempX:real; {координаты при рисовании графиков}
gr,gm:integer; {переменные для подкл. графического модуля}
i,j:integer;
functionap(q:real):real; {функция выполняющая аппроксимацию}
begin
ap:=c*q;
end;
functionl(q:real):real; {функция, в которой вычисляется многочлен Лагранжа и определяется вид функции для него}
vari,j:integer; {задаем локальные переменные}
x2,s,p:real;
begin
s := 0;
x2 := q;
Fori := 1 to 10 do {в цикле происходит вычисление многочлена Лагранжа}
begin
p := 1;
For j := 1 to 10 do
If (i<>j) then p := p*(x2-x[j])/(x[i]-x[j]);
s := s+y[i]*p;
end;
l := s; {функции присваивается значение многочлена Лагранжа}
end;
functionfx:real; {функция, в которой задаются узлы интерполяции}
begin
fx := sin(13*i+3*i*i)*5+3*i/(i+2);
end;
functionfy:real; {функция, в которой задаются значения узлов интерполяции}
begin
fy := 6*cos(3*i+3*13*i*i)+13*3/16;
end;
begin
ClrScr; {выполняется очистка экрана}
Writeln('Аргументы и значения функции Лагранжа: ');
Fori := 1 to 10 do {в цикле задаются 2 массива: массив узлов интерполяции и массив их значений}
begin
x[i] := sin(13*i+3*i*i)*5+3*i/(i+2); {массив узлов интерполяции}
y[i]:=6*cos(3*i+3*13*i*i)+13*3/16; {массив значений узлов интерполяции}
writeln(x[i]:3:3,' ',y[i]:3:3); {вывод на экран обоих массивов, по выведенным значениям можно проверить правильность построенного далее графика}
end;
{Выполняем аппроксимацию (приближение к прямой y=cx)}
Fori := 1 to 10 do {в цикле вычисляются значения сумм, с помощью функций fx и fy, заданных ранее}
begin
sx := sx + fx; {вычисляется среднее значение xi}
sy := sy + fy; { вычисляется среднее значение yi }
sxx := sxx + sqr(fx); { вычисляется среднее значение xi2}
end;
c := (sx*sy/100)/(sxx/10); {по формуле вычисляем коэффициент с}
writeln('Аппроксимация: ');
writeln('y = ',c:3:3,'*x'); (Выводим на экран уравнение y=cx)
readkey;
{Рисование графика для аппроксимации и функции Лагранжа}
gr := detect;
InitGraph(gr,gm,''); {инициализация графического модуля}
h := 0.0001; {шаг}
a := -9; {левая граница интервала}
b := 9; {правая граница интервала}
M := 0.01; {масштаб}
a2 := a;
while (a2<b) do { в цикле рисуются два графика: график для аппроксимации и для интерполяционного многочлена Лагранжа}
begin
tempY := l(a2); {координата у для интерполяционного многочлена Лагранжа определяется как значение функции Лагранжа на интервале [a,b]}
tempX := (a2-a)*640/(b-a); {вычисляется координата х для обоих графиков}
putpixel(round(tempX), 240-round(m*tempY),2); {рисуем график интерполяционного многочлена Лагранжа, при этом координата y умножается на масштаб }
tempY := ap(a2); {координата у для прямой, полученной при аппроксимации, определяется как значение функции ар}
putpixel(round(tempX), 240-round(m*tempY),4); {рисуем прямую y=c1*x+c2, при этом координата y умножается на масштаб}
a2 := a2+h; {увеличиваем а2 (координата по оси х) на шаг}
end;
{Золотое сечение}
e := 0.002; {погрешность}
a := -1; {левая граница интервала}
b := 0; {правая граница интервала}
repeat {в цикле находятся координаты точки максимума}
x1 := a+(b-a)*0.616; {вычисляется координата х точки максимума}
y1 := b-(b-a)*0.616; {вычисляется координата у точки максимума}
if(l(x1)>=l(y1)) then a := y1 else b := x1;
until (abs(a-b)<e); {условие выхода из цикла}
readkey;
closegraph; {закрытие графического модуля}
writeln;
writeln('Точка максимума: ',x1:3:3); {вывод на экран координаты точки максимума}
readkey;
end.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.