Задача 1. Вычислить приближенное значение суммы
1 + x/1! + x2/2! + x3/3! +...
Считаем, что нужное приближение получено, если вычислена сумма нескольких слагаемых, и очередное слагаемое оказалось по модулю меньше, чем данное малое положительное число e.
Для решения задачи мы должны выполнить следующие действия:
1) получить очередное слагаемое (назовем его а);
2) сравнить абсолютную величину слагаемого а с e и, в зависимости от результата сравнения, либо продолжить, либо прекратить вычисления.
Program p;
var a: real;
x: real;
e: real;
i: integer;
S: integer;
Begin
readln(x, e);
i:=1;
a:=1;
S:=0;
WHILE a>e DO
begin
S:=S+a; i:=i+1; a:=a*x/i;
end;
writeln(‘приближенное значение суммы=’,S:4:2)
end.
Задача 2. Рассмотрим часто встречающуюся задачу приближенного решения уравнения f(x)=0, где f(x) - заданная функция. Решить уравнение - значит найти такое значение х*, при котором f(x*)=0. Поиск решения осуществляется на интервале [a;b], причем f(a)<0, а f(b)>0. Используем метод деления пополам. Находим точку с=(а+b)/2 - середина отрезка. Если f(c)>0, то границу b изменяем на значение с, а если f(с)<0, то изменяем а. Процесс продолжаем, пока длина интервала не будет меньше заданной точности.
|
|
Y f(x) 0 a c b X |
Пусть f(x)=x2-2, т.е. мы попытаемся найти значение квадратного корня из 2.
program popolam;
const eps=1.0E-3;
var a,b,c:real;
Function eg(x,y:real):boolean;
begin
Eg:=Abs(x-y)<eps
end;
Function F(x:real):real;
begin
F:=Sgr(x)-2
end;
BEGIN
Writeln(‘введите интервал’); readln(a,b);
if F(a)*F(b)>0 then writeln(‘на этом интервале мы не можем
найти решение уравнения’)
else begin
while Not Eg(a,b) do
begin c:=(a+b)/2;
if F(c)>0 then b:=c else a:=c
end;
writeln(‘Результат ’,a)
end;
readln
end.
Можно с помощью этой программы решить уравнения:
x2-6x+5=0 x-cosx=0 x-lnx-2=0 2x3-9x2-60x+1=0
Y 0 a x1 x2........ xn-2 xn X |
Задача 3. Пусть непрерывная положительная на отрезке [a,b] (a<b) функция. Вычислим площадь фигуры, ограниченную графиком функции f(x), осью х и прямыми х=а и х=b. Для этого разобьем отрезок [a,b] на n равных отрезков одинаковой длины Dx=(b-a)/n a=x0<x1<...<xi<xi+1<....<xn=b
На каждом из отрезков [xi,xi+1] как на основании, построим прямоугольник с высотой f(xi).
Площадь прямоугольников мы умеем находить. Сумма площадей всех прямоугольников даст приближенное значение площади фигуры:
Sприб=(b-a)/n*(f(x0)+....f(xn-1))
Естественно, что чем мельче будет разбиение, тем точнее мы подсчитаем площадь фигуры.
Для отладки программы возьмем функцию f(x2) на отрезке [1,2]. Площадь фигуры равна 2,333....
program trapez;
const eps=1.0E-3;
var a,b,s,dx:real;
i,n: integer;
Function eg(x,y:real):boolean;
begin
Eg:=Abs(x-y)<eps
end;
Function F(x:real):real;
begin
F:=Sgr(x)
end;
BEGIN
Writeln(‘введите интервал и число частей для разбивки’); readln(a,b,n);
x:=a; dx:=(b-a)/n; s:=0;
For i:=1 to n-1 do
begin
s:=s+F(x);
x:=x+dx;
end;
writeln(‘Результат = ’,(b-a)/n*s);
readln;
end.
Вычислить площадь криволинейных трапеций для следующих функций: f(x)=1/(1+x) [0,1] f(x)=1/x [1,3]
|
|
f(x)=sinx [0,p/2]
Задача 4. Для вычисления элементарных функций в математике широко распространено представление этих функций в виде некоторых бесконечных сумм. Не вдаваясь в обоснование таких представлений, приведем некоторые их них:
ex=1 + x + x2/2! + x3/3! +... + xn/n! +...
sinx=x - x3/3! + x5/5! - x7/7! +...+ (-1)nx2n-1/(2n+1)! +....
cosx= 1 - x2/2! + x4/4! - x6/6! +...+ (-1)nx2n/(2n)! +....
ln(1+x)=x - x2/2 + x3/3 - x4/4 +...+ (-1)n+1xn/n +..... (-1<x<=1)
В каждом из разложений точность представления функции будет, вообще говоря, тем выше, чем больше взято слагаемых в сумме. Причем значения самих слагаемых с ростом n стремятся к нулю. Для вычисления значений функции с некоторой заданной точностью e поступают следующим образом. Вычисляют и суммируют слагаемые до тех тор, пока очередное слагаемое не станет по абсолютной величине меньше e или абсолютное значение разности между соседними слагаемыми не станет меньше e. Полученную сумму и принимают за приближенное значение функции.
Вычисли функцию sinx.
Program rad;
const eps=1.0E-3;
var x,sn,ss: real;
p, n: integer;
{p - используется для чередования знака слагаемого}
Function Eg(x,y;real):boolean;
begin
Eg:=Abs(x-y)<eps
end;
Function F(n:integer;var x:real):real;
var i:integer;
s:longint;
begin
s:=1;
for i:=2 to n do s:=s*i;
x:=x*sqr(x); F:=x/s
end;
BEGIN
writeln(‘Введите значение х’);
readln(x);
ss:=0; sn:=x; n:=1; p:=1;
Repeat
ss:=sn; {предыдущее значение слагаемого}
{ новое значение слагаемого}
n:=n+2; p:=-1*p; sn:=ss+p*F(n,x)
Until Eq(ss,sn) or (n>=12);
Writeln(‘Результат=’,sn); readln
end.