Учебник. К.Ю Поляков, Е.А. Ерёмин. Информатика. 10 класс. Углублённый уровень. §70 Решение уравнений
Практическая работа №65. Вычисление площади фигуры
//Уровень A. Найдите площадь фигуры, ограниченной параболой y = x * x и осью OX, на интервале [0;10] .
//Уровень B. Найдите площадь фигуры, ограниченной графиками функций y = x * x и y = 4 * cos(x).
//Уровень C. Найдите площадь фигуры, ограниченной эллипсом (x*x)/(a*a)+(y*y)/(b*b)=1
// при a = 2 и b = 3.
//Сравните ваш результат с точным значением S = Pi*a*b. Экспериментально определите
//наибольший интервал дискретизации, при котором ошибка численного метода составляет не более 1%.
PASCAL
program pr65ABC;
type
FUN = function(x: real): real;
function f1A(x: real): real;
begin
f1A := x * x;
end;
function f2A(x: real): real;
begin
f2A := 0;
end;
function fB(x: real): real;
begin
fB := x * x - 4 * cos(x);
end;
function f1B(x: real): real;
begin
f1B := 4 * cos(x);
end;
function f2B(x: real): real;
begin
f2B := x * x;
end;
function f1C(x: real): real;
begin
if abs(x) > 2 then f1C:=0
else f1C := sqrt((1 - (x * x) / (2 * 2)) * 3 * 3);
end;
function f2C(x: real): real;
begin
if abs(x) > 2 then f2C:=0
else f2C := -sqrt((1 - (x * x) / (2 * 2)) * 3 * 3);
end;
procedure interval(var l, r: real; f: FUN);
const
eps = 0.00001;
var
n: byte;
delta, a, b, c: real;
begin
n := 0;
a := -100;
while a <= 100 do
begin
while (f(a) * f(a + 0.1) > 0) and (a <= 100) do a := a + 0.1;
if (f(a) * f(a + 0.1) < 0)
then begin
b := a + 0.1;
delta := 2 * eps;
while b - a > delta do
begin
c := (a + b) / 2;
if f(a) * f(c) <= 0
then b := c
else a := c;
end;
if n = 0 then l := (a + b) / 2 else r := (a + b) / 2;
end;
a := a + 0.1;
n := n + 1;
end;
end;
var
x, S, S0, h, a, b: real;
begin
//Уровень А
writeln('Метод прямоугольников');
a := 0; b := 10; h := 0.01;
S := 0; x := a;
while x < b do
begin
S := S + f1A(x + h / 2) - f2A(x + h / 2);
x := x + h;
end;
S := h * S;
writeln('Площадь ', S:8:3);
//Уровень B
writeln('Метод трапеций');
interval(a, b, fB);
S := 0; x := a; h := 0.01;
while x < b do
begin
S := S + f1B(x) - f2B(x) + f1B(x + h) - f2B(x + h);
x := x + h;
end;
S := h * S / 2;
writeln('Площадь ', S:8:3);
//Уровень C
S0 := PI * 2 * 3;
writeln('Метод трапеций');
a := -2; b := 2; h := 2;
repeat
S := 0; x := a; h := h / 2;
while x < b do
begin
S := S + f1C(x) - f2C(x) + f1C(x + h) - f2C(x + h);
x := x + h;
end;
S := h * S / 2;
until (abs(S0 - S) / S0 < 0.0001);
writeln('Площадь ', S:8:3);
writeln('Площадь по формуле', S0:8:3);
writeln('Интервал дискретизации для 0.01% ', h:8:5);
end.
C++
#include [iostream]
#include [math.h]
using namespace std;
typedef double (*fun)(double x);
double f1A(double x)
{
return x * x;
}
double f2A(double x)
{
return 0;
}
double fB(double x)
{
return x * x - 4 * cos(x);
}
double f1B(double x)
{
return 4 * cos(x);
}
double f2B(double x)
{
return x * x;
}
double f1C(double x)
{
if (fabs(x) > 2) return 0;
else return sqrt((1 - (x * x) / (2 * 2)) * 3 * 3);
}
double f2C(double x)
{
if (fabs(x) > 2) return 0;
else return -sqrt((1 - (x * x) / (2 * 2)) * 3 * 3);
}
void interval(double &l, double &r, fun f)
{
const double eps = 0.00001;
short int n;
double delta, a, b, c;
n = 0;
a = -100;
while (a <= 100)
{
while ((f(a) * f(a + 0.1) > 0) && (a <= 100)) a = a + 0.1;
if (f(a) * f(a + 0.1) < 0)
{
b = a + 0.1;
delta = 2 * eps;
while (b - a > delta)
{
c = (a + b) / 2;
if (f(a) * f(c) <= 0) b = c;
else a = c;
}
if (n == 0) l = (a + b) / 2; else r = (a + b) / 2;
}
a = a + 0.1;
n = n + 1;
}
}
int main()
{
double x, S, S0, h, a, b;
/*Уровень А*/
cout << "Метод прямоугольников" << endl;
a = 0; b = 10; h = 0.01;
S = 0; x = a;
while (x < b)
{
S = S + f1A(x + h / 2) - f2A(x + h / 2);
x = x + h;
}
S = h * S;
cout << "Площадь " << endl;
/*Уровень B*/
cout << "Метод трапеций" << endl;
interval(a, b, fB);
S = 0; x = a; h = 0.01;
while (x < b)
{
S = S + f1B(x) - f2B(x) + f1B(x + h) - f2B(x + h);
x = x + h;
}
S = h * S / 2;
cout << "Площадь " << S << endl;
//Уровень C
S0 = M_PI * 2 * 3;
cout << "Метод трапеций" << endl;
a = -2; b = 2; h = 2;
do {
S = 0; x = a; h = h / 2;
while (x < b)
{
S = S + f1C(x) - f2C(x) + f1C(x + h) - f2C(x + h);
x = x + h;
}
S = h * S / 2;
}
while (fabs(S0 - S) / S0 > 0.0001);
cout << "Площадь " << S << endl;
cout << "Площадь по формуле " << S0 <
cout << "Интервал дискретизации для 0.01% " << h << endl; }