Учебник. К.Ю Поляков, Е.А. Ерёмин. Информатика. 10 класс. Углублённый уровень. §70 Решение уравнений
Практическая работа №62. Решение уравнений методом методом деления отрезка пополам
Напишите программу, которая находит все решения заданного вам уравнения на интервале [-5;5]. Программа должна выполнить следующие действия:
1. Определяет и выводит на экран интервалы, на которых расположены корни уравнения.
2. На каждом интервале, используя метод перебора, ищет решение с точностью 0,001 и выводит полученные решения на экран.
Вычисление функции, стоящей в левой части уравнения, оформите в виде подпрограммы.
Уровень A. Интервалы, на которых расположены корни, можно найти с помощью электронных таблиц. Программа запрашивает границы очередного интервала и выводит найденный корень уравнения.
Пример:
Введите границы интервала:
1.5 2
Решение: 1.7201
Уровень B. Составить две программы, одна из которых выделяет все интервалы, на которых находятся корни, а вторая запрашивает границы очередного интервала и выводит найденный корень уравнения, а также число шагов, которые потребовались для достижения заданной точности.
Пример:
Введите границы интервала:
1.5 2
Решение: 1.7201
Число шагов: 8
Уровень C. Составить одну программу, которая работает полностью автоматически: достаточно ввести в программу функцию и запустить. Программа находит все интервалы, на которых расположены корни и уточняет решения. После того, как очередной интервал найден, программа выводит его на экран и, применяя метод деления отрезка пополам, уточняет решение и определяет необходимое для этого количество шагов.
Пример:
Интервал [-2;-1,5]
Решение: -1.7201
Число шагов: 8
Интервал [1,5;2]
Решение: 1.7201
Число шагов: 8
Вариант 1. x3 - 8*x + 1 = sin(x)
program pr62ABC;
function f(x: real): real;
begin
f := x * x * x - 8 * x + 1 - 5 * sin(x);
end;
const
eps = 0.001;
var
delta, a, b, c: real;
k: integer;
begin
//Уровень АB
writeln('Введите границы интервала:');
readln(a, b);
k := 0;
delta := 2 * eps;
if (f(a) * f(b) > 0 ) then writeln('На промежутке может не быть корней')
else begin
while b - a > delta do
begin
k := k + 1;
c := (a + b) / 2;
if f(a) * f(c) <= 0
then b := c
else a := c;
end;
writeln('Решение: ', (a + b) / 2:6:3);
writeln('Число шагов: ', k);
end;
//Уровень C
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
writeln('Интервал [', a, ';', a + 0.1, ']');
k := 0;
b := a + 0.1;
delta := 2 * eps;
while b - a > delta do
begin
k := k + 1;
c := (a + b) / 2;
if f(a) * f(c) <= 0
then b := c
else a := c;
end;
writeln('Решение: ', (a + b) / 2:6:3);
writeln('Число шагов: ', k);
end;
a := a + 0.1;
end;
end.
C++
#include [iostream]
#include [math.h]
using namespace std;
double f(double x)
{
return x * x * x - 8 * x + 1 - 5 * sin(x);
}
int main ()
{
double delta, a, b, c;
double eps = 0.001;
int k;
setlocale(LC_ALL, "Russian");
//Уровень АB
cout << "Введите границы интервала: ";
cin >> a >> b;
k = 0;
delta = 2 * eps;
if (f(a) * f(b) > 0 ) cout << "На промежутке может не быть корней" << endl;
else {
while (b - a > delta)
{
k ++;
c = (a + b) / 2;
if (f(a) * f(c) <= 0) b = c;
else a = c;
}
cout << "Решение: " << (a + b) / 2 << endl;
cout << "Число шагов: " << k << endl;
}
//Уровень C
while (a <= 100)
{
while ((f(a) * f(a + 0.1) > 0) && (a <= 100)) a += 0.1;
if (f(a) * f(a + 0.1) < 0)
{
cout << "Интервал [" << a << ";" << a + 0.1 << "]" << endl;
k = 0;
b = a + 0.1;
delta = 2 * eps;
while (b - a > delta)
{
k = k + 1;
c = (a + b) / 2;
if (f(a) * f(c) <= 0) b = c;
else a = c;
}
cout << "Решение: " << (a + b) / 2 << endl;
cout << "Число шагов: " << k << endl;
}
a += 0.1;
};
return 0;
}