Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TP_Ch_I_izm.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.27 Mб
Скачать

II. Экспериментальный раздел работы

Пример 1. Вычислим , где значения аргумента выражены в градусах.

Сократим число членов в представленном выражении до четырех

.

Начиная с «хвоста», запишем

Начальное значение , далее для k=n-1,…1:

Кроме того, нужно перевести градусы в радианы .

Алгоритм вычисления:

  1. «подготовка» цикла: n:=45; k:=n; p:=k;

  2. «тело» цикла: k:=k-1; p:=p*pi/180; p:=k +cos(p);

  3. «управление» циклом: если k>1, то выполнять тело цикла;

  4. вывод результата y=cos(p).

Составим подпрограмму

program Example_91;

function Ycos(n:integer):real;

var k:integer; p:real;

begin

k:=n; p:=k;

for k:=n-1 downto 1 do

begin p:=p*pi/180; p:=k + cos(p) end;

Ycos:=cos(p)

end;

var x:real; n:integer;

begin

writeln(‘Введите n=?’); readln(n);

writeln(‘ S =?’, Ycos(n):10:3); readln

end.

Проведите тестовые расчеты при разных значениях параметров.

Пример 2. Составим подпрограмму-функцию вычисления arctg(x) для -1<x<1

с помощью цепной дроби

где коэффициенты k заданы .

Вычислениe цепных дробей легко реализуются с помощью алгоритма Горнера:

function Atan_1(x:real):real;

const n=4;

var u,p : real; m : integer;

k : real;

begin

k:=-0.20556880; {k- последний коэффициент}

u:=sqr(x); p:=k;

for m:=n-1 downto 0 do

begin

writeln(‘Введите очередной коэффициент’);

{0.99999752,-3.00064286, -0.55703890, -17.03715998, -0.20556880}

readln(k);

p:=k+u / p;

end;

Atan_1:=x*p

end;

Проведите тестирование программы, выполнив вычисления при разных значениях параметра x . Полученные значения сравните с табличными значениями функции.

Пример 3. Вычислим интеграл вероятности

используя следующую формулу для его аппроксимации

,

где . Здесь коэффициенты ak заданы.

Program Example_93;

function Erf (x:real):real;

const m=6;

var а,p,q:real;

m,k:integer;

begin

a:=0.3275911;

q:=1/(1+a*x); p:=1.0614054;

for k:=m-2 downto 1 do

begin

writeln(‘введите следующий элемент’);

{0.2548295, -0.28449673,1.4214137,-1.453152, 1.0614054}

readln(a);

p:=a+q*p;

end;

Erf:=1-q*p*exp(-sqr(x));

end;

var xmin,xmax,dx,x :real; k,kmax :integer;

begin

xmin:=0; xmax:=3; dx:=0.1;

kmax:=trunc((xmax-xmin)/dx) +1;

for k:=1 to kmax do

begin

x:=xmin + (k-1)*dx;

writeln(k:4,’ ‘,x:5:0,’ ‘,Erf(x):10:6)

end;

readln

end.

Здесь xmin,xmax – промежуток а dx – шаг табуляции функции.

Проведите тестирование программы для функций и в диапазоне от 0 до 3.

Пример 4. Разработаем программу, позволяющую рассчитывать таблицу значений многочлена , его первой и второй производных для х в диапазоне от xmin= 0 до max= 9 с шагом dх=3.

Не будем торопиться решать эту задачу «в лоб», а воспользуемся рекуррентным соотношением и дважды продифференцируем его по х:

Вычисления можно организовать так. Начальные значения очевидно . Далее в цикле, от k=n-1 до 0, необходимо «прокручивать» систему рекуррентных формул

.

Составим программу для многочлена вида :

program Example_94;

const n=3;

var a, xmin,xmax,dx,x,p,p1,p2 :real; m, k,nmax :integer;

begin

xmin:=0; xmax:=9; dx:=3;

nmax:=trunc((xmax-xmin)/dx) +1;

for m:=1 to nmax do

begin x:=xmin + (m-1)*dx;

p:=-7.0; p1:=0; p2:=0;

for k:=n-1 downto 0 do

begin

p2:=2*p1 + x*p2; p1:=p + x*p1;

writeln(‘введите следующий элемент’);

{2.1, 3.6, 8.5, -7.0}

readln(a);

p:=a+ x*p

end;

writeln(m:4,’ ‘,x:5:0,’ ‘,p:7:3,’ ‘,p1:7:3,’ ‘,p2:7:3)

end;

readln

end.

Пример 5 (для опытных). Вычислить корень нелинейного уравнения f(x)=0 методом касательной.

Выберем начальное приближение к решению . Это можно сделать, например, проводя табуляцию функции и построив ее график. Значение выберем вблизи точки, где функция меняет знак, т.е. одного из корней уравнения f(x)=0. Далее, вычислив и , из очевидного равенства

легко найти формулу для вычисления следующего приближения аргумента

или обобщая, получим рекуррентное соотношение Ньютона:

,

где поправка к «старому» значению аргумента , которая должна улучшать «новое» значение , приближая его к искомому значению x.

Если , то для решения поставленной задачи, можно воспользоваться результатами, полученными в предыдущем примере. Запишем подпрограмму-функцию:

function X_Newt( x, eps: real): real;

function Delta(x: real): real;

const n=3;

a : array[0..n] of real = (2.1, 3.6, 8.5, -7.0);

var p,p1:real; k:integer;

begin

p:=a[n]; p1:=0;

for k:=n-1 downto 0 do

begin p1:=p + x*p1; p:=a[k] + x*p end;

Delta:= - p/p1

end;

var

begin k:=0; kmax:=100;

repeat

Inc(k); if (k>kmax) then begin writeln(‘Error_01’;Exit end;

xs:=x; x:=x + Delta(x);

until abs (xs-x) <eps;

end;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]