- •Оглавление
- •1. 2. Среда Турбо-Паскаль
- •1. 3. Структура языка Турбо-Паскаль
- •1. 4. Типы переменных
- •Var a1, a2 : array [ 1 . . 1000 ] of real ;
- •Var m1: array[1..200] of integer; a1: array[100..200] of real;
- •Var t1,t2:Date_m; c1:Ruch_b; s1:Lat_b; a1,a2:Otmetka; b:Ball;
- •1. 5. Структура программы
- •1. 6. Операции и стандартные функции
- •1. 7. Операторы Турбо-Паскаля
- •Составной оператор Begin "операторы" end;
- •1. 7. 1. Операторы ввода/вывода данных
- •Операторы вывода данных на экран Write("сп"); или Writeln("сп");
- •X1, y1, z1: integer; xb, yb, zb: boolean;
- •Var n, X, y: real;
- •1. 7. 2. Оператор выбора
- •0..9: Writeln('однозначное');
- •1. 7. 3. Условный оператор
- •If "условие" Then "оператор1" Else "оператор2";
- •Var V : integer; Then
- •If Writeln(a2)
- •1. 7. 4. Оператор цикла с параметром
- •Var a, s, Sn, I, n: word;
- •Var s, Sn, pr: real; I, n: integer;
- •Var y, X, a, dx: real; I, j: integer;
- •Var a1, a2, n1, s, g: longint; bb: boolean;
- •1. 7. 5. Операторы цикла с условием
- •Var y, y1, X, eps, a, k: real; n: Word;
- •1. 7. 6. Операторы ограничения и прерывания цикла
- •1. 7. 7. Оператор перехода к метке
- •Var b, a: longint;
- •1. 8. Блок - схемы алгоритмов
- •1. 9. Составление диалоговых программ
- •Var I, n, n1: integer;
- •1. 10. Массивы
- •1. 10. 1. Линейные массивы
- •1. 10. 2. Работа с элементами переменной строкового типа
- •1. 10. 3. Двумерные массивы
- •Var a: array[1..30, 1..7] of byte;
- •2 S[2] Массив a: a[2, 1] a[2, 2] a[2, 3] a[2, 4] . . . A[2, j] . . . A[2, m]
- •1. 10. 4. Создание баз данных с использованием массивов записей
- •I: byte;
- •1. 10. 5. Работа с большими массивами
- •I, j: word;
- •1. 11. Текстовые файлы
- •Var c: char; j, I: word;
- •1. 12. Разработка функций и процедур
- •1. 12. 1. Описание функций и процедур
- •Viz(Dat); { вызов процедуры } Readln end.
- •Var z: r_1000; x1, x2: real; n: word;
- •Var X: m_30х30_r; I, j, n, m: byte;
- •Var a, b, c, ha, hb, hc: real;
- •Var p, s: real;
- •Var y, y1, x1: real;
- •Var a, k, y: real; I: longint;
- •1. 12. 2. Рекурсивные функции и процедуры
- •Var n_1: Longint; I: word;
- •Var ch: char; I: word;
- •Var n, n1: integer;
- •1. 13. Разработка модулей
- •Interface
- •1. 14. Модуль сrt
- •1. 14. 1. Управление экраном в текстовом режиме
- •InsLine; Вставка пустой строки.
- •1. 14. 2. Управление клавиатурой
- •Var n : word; f, dx, X, y, I, j, xm, ym : byte;
- •1. 14. 3. Работа с символьными переменными
- •Var r: registers;
- •X, y, I, xm, ym: byte;
- •1. 14. 4. Работа со строковыми переменными
- •1. 14. 5. Управление звуковыми сигналами
- •1. 15. Модуль Graph
- •1. 15. 1. Инициализация графического режима
- •InitGraph(Gd, Gm, 'way');
- •1. 15. 2. Простейшие графические процедуры и функции
- •Var X, y, VX, Vy, p: array[1..N] of integer; ch: char;
- •I1, i2, zx, zy, ax, ay, I, k: integer;
- •1. 15. 3. Рисование геометрических фигур
- •1. 15. 3. 1. Построение заполненных фигур
- •Var I, x1, y1, x2, y2, Gd, Gm : integer;
- •1. 15. 3. 2. Работа с линиями
- •1. 15. 3. 3 Создание графических узоров
- •1. Перемещение фигуры.
- •2. Масштабирование фигуры.
- •3. Симметричное отображение фигуры.
- •4. Штриховка углов.
- •Var xx1, xx2, yy1, yy2, I: integer; k: real;
- •5. Использование рекурсии.
- •Var gD, gM, n, X, y, x1, y1, k: integer; dl, ugol, ugol_0, s, I: real;
- •6. Создание узоров построением зеркальных отображений фигуры.
- •Var I, j : integer;
- •Var I, j : integer;
- •1. 15. 3. 4. Работа с текстом в графическом режиме
- •Var Gd, Gm, k, X, y, Size: integer; s: string;
- •1. 15. 5. Мультипликация
- •1. 15. 5. 1. Мультипликация с запоминанием части экрана
- •Var Gd, Gm, I, j, k, Size, X, y, Xmax, Ymax: Integer;
- •1. 15. 5. 2. Мультипликация с чередованием видеостраниц
- •1. 15. 5. 3. Мультипликация с управлением движения образа
- •1. 15. 5. 4. Модификация контурного изображения
- •Var Gd, Gm, I, j, k, n, xc, yc, r, m: integer;
- •X, y, x1, y1, x2, y2: array[1..12] of integer; alfa: real;
- •Глава 2. Программирование в среде Турбо - Паскаль
- •2. 1. Геометрические построения на плоскости
- •2. 1. 1. Построение графиков функций
- •0 Left, right GetMaxX
- •Interface
- •Var right, left, down, up: integer; k_xy, kx, ky, x_max, x_min, y_max, y_min: double; { описание глобальных переменных }
- •Implementation
- •Var XX, yy: word; xg_m, yg_m:integer;
- •Var xg0, yg0:integer;
- •1 Спираль a*fi 0 ... 8 -1 1 3 -
- •4 Логарифмическая a*Exp(b*fi) -3 ... 3 -1 1 -1 0 1
- •5 Спираль a*fi2 - b -8 ... 8 -1 1 2 0 1 2
- •6 Роза a*Sin(b*fi) 0 ... 8 -1 1 2 целые и
- •12 Строфоида a*Cos(2*fi)/Cos(fi) 0,1 ... 1,5 -3 -2 1 -
- •13 Циссоида a*Sin2(fi)/Cos(fi) 0,1 ... 1,5 -1 1 2 -
- •2. 1. 2. Графическое решение уравнений
- •2. 1. 3. Уравнение прямой на плоскости
- •2. 1. 4. Построение касательных и нормалей к плоским кривым
- •2. 1. 5. Двумерные преобразования координат
- •Var z: real;
- •Var alfa: real;
- •I_r; picture;
- •2. 1. 6. Проецирование пространственного изображения тела на плоскость
- •2. 2. Некоторые задачи физики
- •2. 2. 1. Механика
- •Var x3, y3, l, Lc, sa, ca, s3, c3: double;
- •2. 2. 2. Оптика и свет
- •2. 2. 3. Электростатика и электромагнетизм
- •2. 3. Математическое моделирование физических процессов
- •2. 4. Моделирование многовариантных задач с использованием графов
- •2. 5. Программы математических расчетов
- •2. 5. 1. Численное решение уравнений
- •2. 5. 2. Аппроксимация по методу наименьших квадратов
- •2. 5. 3. Численный расчет интегралов
- •2. 5. 4. Сортировка одномерных массивов
- •Список литературы
2. 5. Программы математических расчетов
2. 5. 1. Численное решение уравнений
Решение уравнения F(x) = 0 заключается в определении значений переменной "x", при которых функция обращается в нуль, т. е. в нахождении корней уравнения. Методы решения уравнений в конечном, аналитическом виде называются прямыми. Например, для уравнения F(x) = a*X+b = 0; решение имеет вид X = -в/а. Аналитически можно определить корни алгебраических уравнений не выше четвертой степени, причем для показателя степени больше двух формулы получаются достаточно сложные. Для определения корней алгебраических и трансцендентных уравнений разработаны численные методы, основанные на уточнении значения корня в предположении, что на отрезке [A, B] функция Y=F(x) непрерывна и имеет только один корень. В этом случае значения функции на концах отрезка имеют разные знаки. Знак вещественного числа "Y" можно определить при помощи функции:
FUNCTION SGN( Y: real): integer;
Begin if Y < 0 then SGN:= -1 else SGN:= 1 End;
Значение переменной SGN= -1 если Y<0, SGN= 1 если Y>=0.
Рассмотрим некоторые численные методы нахождения корней уравнения.
Метод половинного деления (дихотомии) при нахождении корня уравнения F(x)=0 состоит в делении пополам отрезка [A, B], где находится корень. Затем анализируется изменение знака функции на половинах отрезка и одна из границ отрезка [A, B] переносится в его середину. Переносится та граница, со стороны которой функция на половине отрезка знака не меняет. Далее процесс повторяется. Итерации прекращаются при выполнении одного из условий: либо длина интервала [A, B] становится меньше заданной погрешности нахождения корня "Е", либо функция попадает в полосу шума (Е1) - значение функции сравнимо с погрешностью расчетов.
REPEAT { начало итерации }
x:= (A + B)/2; { x - середина отрезка [A, B] }
Y:= F(x); YA:= F(A); { значения функции в середине и на конце отрезка }
if SGN(Y)* SGN(YA) > 0 { если знаки функции в точках "A" и "x" совпадают }
then A:= x else B:= x { то, перенос границы "A", иначе - "В" }
UNTIL (ABS(B-A)< E) OR (ABS(F(x))< E1);
Метод дихотомии уменьшает интервал определения корня за 1 итерацию в 2 раза - за 20 итераций это составит 220.
Метод секущих (хорд) при нахождении корня уравнения Y = F(x)=0 состоит в определении точки пересечения секущей с осью "x". Секущей называется линия, соединяющая точки с координатами (A, F(A)) и (B, F(B)) на плоскости XoY. Приближенное значение корня определяется точкой пересечения с осью "X" секущей и находится по формуле:
x = (A*F(B) - B*F(A))/(F(B) - F(A));
При следующем приближении вычисляется Y = F(x), YA = F(A) и полагается A=X, если знак функции на половине отрезка [A, x] не меняется, иначе B=x. Далее корень ищется на том отрезке, где функция меняет знак. Процесс прекращается при достижении требуемой точности.
150
Если на исследуемом интервале [A1, B1] функция имеет несколько корней x1[1. . m], то для их нахождения можно разбить этот интервал на "N" малых интервалов и выбрать из них те, где функция меняет знак. Здесь полагается, что на каждом малом интервале функция имеет не более одного корня. Затем следует на каждом выбранном малом интервале применить метод дихотомии или секущих:
Y МЕТОД СЕКУЩИХ
F(B)
Y(x)
0 A x B X
F(A)
dx:= (b1-a1)/N; { длина отрезков }
m:= 0 { счетчик корней }
for k:= 1 to N do begin
a:= a1+(k-1)*dx; b:= a+dx;
if SGN(F(a))* SGN(F(b) <= 0
then begin m:= m+1;
REPEAT << метод дихотомии >>
UNTIL (ABS(b-a)< E) OR (ABS(F(x)) < E1);
x1[m]:= x; { корень номер m }
end
end;
Практическое задание N 2. 28
1. Рассчитать методом дихотомии, либо секущих корней уравнения F(x) = 0. Определить количество итераций, для расчета корня с погрешностью < 0. 0001.
N Вид функции F(x) интервал изменения аргумента "x"
один корень несколько корней
1 x3 - 4*x2 - x + 1 0 ... 1 -2 ... 6
2 2*x3 - 6*x2 - x - 1 -1 ... 0 -1 ... 4
3 x - 2 + 4*SIN(x) 0 ... 1 0 ... 7
4 x2 - LN(1+x) - 3 -0.9 ... 1 -0.9 ... 3
В общем случае уравнение F(x) = 0 решается итерационными методами.
Метод итераций (повторений) основан на расчете значения переменной по рекуррентным формулам. Общая итерационная формула имеет вид:
xi = Fi(xi-1); где i = 1, 2, . . . , m; x0 - начальное приближение.
Для сходимости итерационной схемы должно выполняться условие:|dFi(x)/dx|< 1;
В случае линейной итерационной схемы xi = xi-1 - Ki-1*F(xi-1);
Коэффициент Ki-1 зависит от выбранной схемы и может существенно повлиять на количество итераций, необходимых для получения решения с заданной точностью.
Получим итерационную формулу для расчета корня из числа "a", т. е. x= a;
(x- a)2 = x2 - 2*x* a + a =0; откуда a = (x + a/x)/2; где a > 0.
полагая a = xi; и x = xi-1; получаем: xi = (xi-1 + a/xi-1)/2;
n
В более общем виде для x = a; xi = ((n-1)*xi-1 + a/(xi-1)(n-1))/n;
151
Практическое задание N 2. 29
Составить функцию
1_1. Итерационного расчета корня n-ой степени из положительного числа "a".
1_2. Итерационного расчета корня уравнения: x= Ln(A+x); при x>0; A>1;
1_3. Итерационного расчета корня уравнения: x= Arctg(x); при x<>0;