- •Структурное 1
- •Этапы разработки программ
- •Этапы разработки программ
- •Этапы разработки программ
- •Методы проектирования программ
- •Проектирование «снизу вверх»
- •Проектирование «сверху вниз»
- •Структурное программирование
- •Структурное программирование
- •Модуль
- •Оформление текста программы
- •Оформление текста программы
- •Оформление текста программы
- •Проект «Графики функций»
- •Структура программы
- •Разбивка программы на этапы
- •Функции, заданные в неявном виде
- •Полярные координаты
- •Полярные координаты
- •Описание в параметрической форме
- •Системы координат
- •Структура программы
- •Перевод в экранные координаты
- •Оси координат
- •Разметка оси X («черточки»)
- •Разметка оси X (числа)
- •Оси с разметкой (полностью)
- •Задания
- •Построение графика по точкам
- •Вывод точки с проверкой
- •Описание функций
- •Области определения
- •Вывод графика функции
- •Общее расположение
- •Задания
- •Точки пересечения
- •Методы решения уравнений
- •Численные методы
- •Метод прямого («тупого») перебора
- •Есть ли решение на [a, b]?
- •Метод дихотомии (деление пополам)
- •Метод дихотомии (деления пополам)
- •Метод дихотомии (в программе)
- •Метод дихотомии (в программе)
- •Штриховка (две функции)
- •Штриховка (составная нижняя граница)
- •Штриховка (общий случай)
- •Метод (левых) прямоугольников
- •Метод (правых) прямоугольников
- •Метод (средних) прямоугольников
- •Метод трапеций
- •Метод Монте-Карло
- •Метод Монте-Карло
- •Случайное число в заданном интервале
- •Проверка точки (внутри или нет?)
- •Метод Монте-Карло (реализация)
- •Титульный лист
- •Графики функций
- •Как получить копию экрана?
- •Структура программы
- •Текст программы
- •Как включить программу в отчет?
- •Конец фильма
Штриховка (две функции)
y = f2 y
xс1
(x) |
|
|
й |
|
|
|
|
|
|
и |
|
|
н |
|
|
и |
|
|
|
Nл |
|
|
|
h
y = f1 (x)
xс2 x
void Hatch() |
|
{ |
|
const N = 10; |
|
float x, h = (xc2 |
- xc1) |
int xe, yUp, yDown; |
|
for (x = xc1+h; x |
< |
{ |
|
xe = ScreenX ( x ); |
|
yUp = ScreenY ( |
f1(x) ); |
yDown = ScreenY |
( f2(x) |
line ( xe, yUp, |
xe, yDown |
} |
|
} |
|
51
h xc2 xc1 N 1
шаг по x
экранная координата x
экранные координаты границ
области по оси y
Штриховка (составная нижняя граница) |
52 |
|
y = f2
y
xс1
(x)
|
|
|
й |
|
|
и |
|
|
н |
|
|
и |
|
|
|
Nл |
|
|
|
h
xс2
void Hatch()
{
...
h = ( xc3 - xc1) / (N + 1);
...
yDown = ScreenY ( Down(x) );
...
}
y = f3 (x)
y = f1 |
(x) |
xc1 |
|
|
h |
xc3 |
|
|
N 1 |
||
|
|
xс3 x
//----------------------------
// Down нижняя граница области
//----------------------------
float Down ( float x )
{
if ( x < xc2 ) return f2(x);
else return f3(x);
}
Штриховка (общий случай) |
53 |
|||
|
|
|||
|
|
|
|
|
float Up ( float x ) |
{ ... } |
|
|
|
float Down ( float x ) { ... } |
|
|
||
... |
|
у всех |
|
|
void Hatch() |
|
|
|
|
{ |
по-разному… |
|
|
|
|
|
|
|
|
const N = 10; |
|
|
|
|
float x, h = ( xc3 - xc1 |
(N + 1); |
|
|
|
int xe, yUp, yDown; |
|
|
|
|
for ( x = xc1+h; x < xc3; x += h ) |
|
|
||
{ |
|
|
|
|
xe = ScreenX ( x ); |
|
|
|
|
yUp = ScreenY ( |
Up(x) |
); |
|
|
yDown = ScreenY ( Down(x) );
line ( xe, yUp, xe, yDown );
}
}
54
Структурное
программирование на языке Си
Тема 6. Вычисление площади
© К.Ю. Поляков, 2007
Метод (левых) прямоугольников |
55 |
|
|
y = f2 (x) |
y = f1 (x) |
S S1 S2 |
|||||||
y |
|
|
|
|
|
|
||||
|
S1 |
|
S2 |
|
|
|
|
|
||
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
||||
|
|
|
S |
S4 |
|
|
||||
|
|
|
|
|||||||
|
|
|
|
|||||||
|
|
|
|
|||||||
|
|
|
|
|||||||
|
|
|
|
|||||||
|
|
|
|
|||||||
|
|
|
|
|||||||
|
|
|
|
|
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x |
xс1 |
|
|
h |
|
|
|
xс2 |
|
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
||||||||
|
|
|
|
|
|
|
|
void Area()
{
float x, S = 0, h=0.001; char out[20];
for ( x = xc1; x < xc2; x += h ) S += f1(x) – f2(x);
S *= h;
sprintf ( out, "S=%7.3f", S ); outtextxy ( 300, 300, out );
}
S3 S4 |
f1 (x) |
Si
f2 (x) x x+h
Si ( f1 (x) f2 (x)) h
?Почему не
x <= xc2?
?Как улучшить решение?
Метод (правых) прямоугольников |
56 |
||||||||||||||||||||
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y = f2 (x) |
|
|
y = f1 (x) |
S S1 S2 S3 S4 |
f1 (x) |
|
|
|
|
|||||||||||
y |
|
|
|
|
|
|
|
|
|
|
Si |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
S1 |
|
S |
S3 |
|
|
S4 |
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
f2 (x) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xс1 |
|
|
|
|
|
|
|
xс2 |
|
x |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
h |
|
|
|
|
|
|
x+h |
|||||||||
|
|
|
|
|
|
|
|
|
x |
|
|||||||||||
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|||||||||||||
void Area() |
|
|
|
|
|
|
|
Si ( f1 (x h) |
f2 (x h)) h |
||||||||||||
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float x, S = 0, h=0.001; char out[20];
for ( x = xc1; x < xc2; x += h ) S += f1(x+h) – f2(x+h);
S *= h;
sprintf ( out, "S=%7.3f", S ); outtextxy ( 300, 300, out );
}
Метод (средних) прямоугольников |
57 |
||||||||||||||||||||
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y = f2 (x) |
|
|
y = f1 (x) |
S S1 S2 S3 S4 |
(x) |
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
||||||||||||||
y |
|
|
|
|
|
|
|
|
|
|
|
|
|
f1 |
|
|
|
|
|
||
|
|
|
S1 |
|
|
|
|
|
S |
|
|
|
f2 (x) |
|
Si |
|
|||||
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
S2 |
S3 |
|
4 |
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x |
|
x |
x h x+h |
|||
|
|
xс1 |
|
|
|
h |
|
|
|
xс2 |
|
||||||||||
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
void Area()
{
float x, S = 0, h=0.001; char out[20];
for ( x = xc1; x < xc2; x += h ) S += f1(x+h/2) – f2(x+h/2);
S *= h;
sprintf ( out, "S=%7.3f", S ); outtextxy ( 300, 300, out );
}
S |
i |
f (x h ) f |
2 |
(x h ) |
h |
|||
|
|
1 |
2 |
2 |
|
|
||
|
|
|
|
|
|
|
? Какой метод точнее?
левые (правые):
O(h )
средние
O(h 2)
Метод трапеций |
|
|
|
|
|
58 |
||||||||||||||||||
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
y = f2 (x) |
|
|
y = f1 (x) |
f1 |
(x) |
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||
y |
|
|
|
S |
|
|
|
|
|
Si |
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
S |
S3 |
|
|
S |
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
1 |
|
|
|
4 |
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f2 |
(x) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
xс1 |
|
|
|
h |
|
|
|
xс2 x |
|
x x+h |
|
|
||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
Si |
f1 (x) f2 (x) f1 (x h) f2 (x h) |
h |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
for ( x = xc1; x < xc2; x += h )
S =( f1(xc1) - f2(xc1)
+ f1(xc2) - f2(xc2) )/2.;
S for ( x = xc1+h; x < xc2; x += h ) S += f1(x) – f2(x);
S *= h;
? Как улучшить?
Ошибка O(h 2)
Метод Монте-Карло |
59 |
|
Применение: вычисление площадей сложных фигур
(трудно применить другие методы).
Требования: необходимо уметь достаточно просто определять, попала ли точка (x, y) внутрь фигуры.
Пример: заданы 100 кругов (координаты центра, радиусы), которые могу пересекаться. Найти площадь области, перекрытой кругами.
? Как найти S?
Метод Монте-Карло |
60 |
|
1. |
Вписываем сложную фигуру в |
На фигуре M точек |
|
другую фигуру, для которой |
|
|
легко вычислить площадь |
|
|
(прямоугольник, круг, …). |
|
2. |
Равномерно N точек со |
|
|
случайными координатами |
|
|
внутри прямоугольника. |
|
3. |
Подсчитываем количество |
Всего N точек |
|
точек, попавших на фигуру: M. |
|
|
|
4. Вычисляем площадь: S |
|
M |
S S0 |
M |
||
|
|
|
|
|
|
|
|
S0 |
N |
N |
|||
|
|
|
|
!1. Метод приближенный.
2.Распределение должно быть равномерным.
3.Чем больше точек, тем точнее.
4.Точность ограничена датчиком случайных чисел.