Учебник. К.Ю Поляков, Е.А. Ерёмин. Информатика. 10 класс. Углублённый уровень. §70 Решение уравнений
Практическая работа №64. Вычисление длины кривой
//Уровень A. Найдите длину параболы y = x * x на интервале [0;10] .
//Уровень B. Для примера «Полет мяча» вычислите длину траектории движения шарика
// для углов вылета 35,5° и 65,8°. Сравните полученные результаты.
//Уровень C. Постройте с помощью табличного процессора эллипс, который описывается уравнением
// (x*x)/(a*a)+(y*y)/(b*b)=1 при a = 2 и b = 3.
//Напишите программу, которая вычисляет периметр этого эллипса с помощью дискретизации.
//Сравните ваш результат с тем, что получается по приближенной формуле Рамануджана:
// L = Pi*|_3*(a+b)-sqrt((3*a+b)(a+3*b))_|
//Экспериментально определите наибольший интервал дискретизации, при котором ошибка
// численного метода (в сравнении с результатом, полученным по формуле Рамануджана)
// составляет не более 1%.
PASCAL
program pr64ABC;
function fA(x: real): real;
begin
fA := x * x;
end;
function fB(x,v0,alfa: real): real;
const g = 9.8;
var t: real;
begin
if v0 = 0 then t := 0 else t := x / v0 * cos(alfa);
fB := v0 * t * sin(alfa) - g * t * t / 2;
end;
function fC(x: real): real;
begin
if abs(x) > 2 then fC:=0
else fC := sqrt((1 - (x * x) / (2 * 2)) * 3 * 3);
end;
var
x, y1, y2, L, L0, L1, L2, v0, h, alfa, a, b: real;
begin
//Уровень А
a := 0; b := 10; h := 0.01;
x:= a;
L:= 0;
while x < b do begin
y1:= fA(x);
y2:= fA(x+h);
L:= L + sqrt(h * h + (y2-y1) * (y2-y1));
x:= x + h;
end;
writeln('Длина кривой ', L:10:3);
//Уровень B
a := 0; b := 10; h := 0.01;
x:= a;
L1:= 0;
alfa := 35.5;
v0 := 12;
while x < b do begin
y1:= fB(x,v0,alfa);
y2:= fB(x+h,v0,alfa);
L1:= L1 + sqrt(h * h + (y2-y1) * (y2-y1));
x:= x + h;
end;
writeln('Длина кривой при ',alfa,' ', L1:10:3);
x:= a;
L1:= 0;
alfa := 65.8;
v0 := 12;
while x < b do begin
y1:= fB(x,v0,alfa);
y2:= fB(x+h,v0,alfa);
L2:= L2 + sqrt(h * h + (y2-y1) * (y2-y1));
x:= x + h;
end;
writeln('Длина кривой при ',alfa,' ', L2:10:3);
//Уровень C
L0 := PI * (3 * (2 + 3) - sqrt((3 * 2 + 3) * (2 + 3 * 3)));
a := -2; b := 2; h := 2;
repeat
L := 0; x := a; h := h / 2;
while x < b do begin
y1:= fC(x);
y2:= fC(x+h);
L:= L + sqrt(h * h + (y2-y1) * (y2-y1));
x:= x + h;
end;
L := L * 2;
until (abs(L0 - L) / L0 < 0.0001);
writeln('Длина кривой ', L:10:3);
writeln('Длина кривой по формуле', L0:8:3);
writeln('Интервал дискретизации для 0.01% ', h:8:5);
end.
C++
#include [iostream]
#include [math.h]
using namespace std;
float fA(float x)
{
return (x * x);
}
float fB(float x, float v0, float alfa)
{ const float g = 9.8;
float t;
if (v0 = 0) t = 0; else t = x / v0 * cos(alfa);
return (v0 * t * sin(alfa) - g * t * t / 2);
}
float fC(float x)
{
if (fabs(x) > 2) return (0);
else return (sqrt((1 - (x * x) / (2 * 2)) * 3 * 3));
}
int main()
{
float x, y1, y2, L, L0, L1, L2, v0, h, alfa, a, b;
//Уровень А
a = 0; b = 10; h = 0.01;
x = a;
L = 0;
while (x < b) {
y1 = fA(x);
y2 = fA(x+h);
L = L + sqrt(h * h + (y2-y1) * (y2-y1));
x = x + h;
}
cout << "Длина кривой " << L << endl;
//Уровень B
a = 0; b = 10; h = 0.01;
x = a;
L1 = 0;
alfa = 35.5;
v0 = 12;
while (x < b) {
y1 = fB(x,v0,alfa);
y2 = fB(x+h,v0,alfa);
L1 = L1 + sqrt(h * h + (y2-y1) * (y2-y1));
x = x + h;
}
cout << "Длина кривой при " << alfa << " " << L1 << endl;
x = a;
L1 = 0;
alfa = 65.8;
v0 = 12;
while (x < b) {
y1 = fB(x,v0,alfa);
y2 = fB(x+h,v0,alfa);
L2 = L2 + sqrt(h * h + (y2-y1) * (y2-y1));
x = x + h;
}
cout << "Длина кривой при " << alfa << " " << L2 << endl;
//Уровень C
L0 = M_PI * (3 * (2 + 3) - sqrt((3 * 2 + 3) * (2 + 3 * 3)));
a = -2; b = 2; h = 2;
do
{ L = 0; x = a; h = h / 2;
while (x < b) {
y1 = fC(x);
y2 = fC(x+h);
L = L + sqrt(h * h + (y2-y1) * (y2-y1));
x = x + h;
}
L = L * 2;
}
while (fabs(L0 - L) / L0 > 0.0001);
cout << "Длина кривой " << L << endl;
cout << "Длина кривой по формуле " << L0 << endl;
cout << "Интервал дискретизации для 0.01% " << h << endl;
return 0;
}