Определение значений функции y(x) на отрезке a ≤ x ≤ b при заданных условиях (Практическая часть)

Страницы работы

Содержание работы

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.

Похожие материалы

Информация о работе