Информатика. Практикум
.pdf
|
|
|
|
|
|
70 |
Y |
|
|
|
|
|
|
|
|
|
60 |
|
|
|
|
|
|
|
|
|
|
50 |
|
|
|
|
|
|
|
|
|
|
40 |
|
|
|
|
|
|
|
|
|
|
30 |
|
|
|
|
|
|
|
|
|
|
20 |
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
0 |
|
|
|
|
-12 |
-10 |
-8 |
-6 |
-4 |
-2 |
-10 0 |
2 |
4 |
6 |
|
|
|
|
|
|
|
-20 |
|
|
|
X |
|
|
|
|
а |
|
|
|
|
|
|
|
1 |
Начало |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
Xn=0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Xk=1 |
|
|
|
|
|
|
|
|
|
|
e=0.005 |
|
|
|
|
|
|
|
|
нет |
3 |
|
|
|
|
|
|
Проверка условия |
||
|
|Xn-Xk|/2 > e |
|
|
|
|
|
||||
|
|
|
|
|
|
|
||||
9 |
|
|
|
|
|
|
окончания вычислений |
|||
4 |
|
|
|
|
|
|
||||
Конец |
да |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
X=(Xn+Xk)/2 |
|
|
|
|
Вычисление новой точки |
||||
нет 5 |
F(X)· |
|
да |
|
|
|
|
|
|
|
7 |
|
F(Xk)<0 |
6 |
|
|
|
|
Определение отрезка |
||
Xk=X |
|
|
|
Xn=X |
|
|
|
для поиска корня - знаки |
||
|
|
|
|
|
|
функции на границах отрезка |
||||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
должны быть различны |
||
8 Вывод
X, F(X),
Xn, Xk
б
Рис. 3.4
141
3.2.2. Задача с использованием метода хорд
Задача 3.5. Разработать схему алгоритма и программу решения нелинейного уравнения f (x) ex 10sin x на отрезке [0, 1] методом хорд с погрешностью не более 0,005.
Решение задачи
Схема алгоритма решения задачи представлена на рис. 3.5.
|
1 |
Начало |
|
|
|
|
|
|
2 |
Xn=0 |
|
|
|
Xk=1 |
|
|
|
e=0.005 |
|
|
|
X=Xn |
|
|
3 |
|
|
|
|
X1=X |
|
|
4 |
|
|
|
|
X=… |
|
нет |
5 |
F(X)· |
да |
7 |
|
F(Xk)<0 |
6 |
Xk=X |
|
|
Xn=X |
|
8 |
Вывод |
|
|
|
Xn, Xk, |
|
|
|
F(X) |
|
нет |
9 |
|X1-X|<e |
|
|
|
|
|
10 |
да |
|
|
|
|
Конец |
|
|
|
|
Рис. 3.5 |
142 |
|
|
|
Вычисление новой точки
X = (Xk·F(Xn)- -Xn·F(Xk)/(F(Xn)-F(Xk))
Определение отрезка для поиска корня - знаки функции на границах отрезка
должны быть различными
Выполнять цикл, пока разница между корнями
текущей (X) и предыдущей (Х1) итераций больше погрешности (e)
Пояснения к схеме алгоритма
Обозначения:
Xn, Xk – значения левой и правой границ отрезка, на котором производится поиск корней нелинейного уравнения;
F(Xn), F(Xk), F(X) – значения функции нелинейного уравнения f (x) ex 10sin x соответственно в точках Хn, Xk, Х.
Символ 1. Начало алгоритма.
Символ 2. Присвоение начальных значений переменным границы отрезка (Xn, Xk), переменной Х и переменной погрешности вычислений (e).
Символ 3. Присвоение переменной Х1 предыдущего приближения к корню уравнения.
Символ 4. Вычисление нового приближения к корню уравнения (Х). Символ 5. Проверка знаков функции на концах отрезка [X, Xk].
Если выражение F(X)∙F(Xk) < 0, то на этом отрезке функция меняет знак и имеется корень; в этом случае выполняется символ 6. Если выражение F(X)∙F(Xk) ≥ 0, то функция на концах отрезка имеет одинаковый знак и, значит, корня на этом отрезке нет; в этом случае выполняется символ 7.
Символ 6. Присвоение переменной начала отрезка (Xn) значения Х. Символ 7. Присвоение переменной конца отрезка (Xk) значения Х. Символ 8. Вывод результатов на экран.
Символ 9. Проверка условия окончания вычислений: разница между текущим и предыдущим приближениями к корню уравнения меньше погрешности (e). Если условие верно, то выполняется сим-
вол 10, иначе – символ 3.
Символ 10. Конец алгоритма.
Программа
Program Chord;
Var
Xn, Xk, X, X1, e : Real;
{вычисление значения функции}
Function F(X : Real) : Real;
Begin {начало раздела операторов функции F}
F := Exp(X) - 10*sin(X); end; {конец функции F}
143
Begin |
{начало раздела операторов основной программы} |
|
Xn := 0; Xk := 1; {задание границ отрезка} |
||
e := 0.0005; |
{значение погрешности вычислений} |
|
X1 := Xn; |
|
|
Repeat |
|
{начало цикла поиска корня} |
X1 := X; |
|
{сохранение корня предыдущей итерации } |
{новое значение границы отрезка}
X := (Xk*F(Xn) - Xn*F(Xk))/(F(Xn) - F(Xk));
{проверка, меняет ли функция знак на отрезке [Xn, X]}
If F(X)*F(Xk) < 0 Then Xn := X {отрезок для анализа [X,Xk]}
Else Xk := X;{отрезок для анализа [Xn,X]} {вывод результатов}
Writeln(' X = ', X :10:8, ' Значение функции = ', F(X):10:8);
Until Abs(X1 - X) <= e; |
{конец |
цикла} |
End. |
{конец |
программы} |
Результат работы программы
X = 0.14933335 Значение функции = -0.32672935 X = 0.11255751 Значение функции = -0.00406326 X = 0.11210201 Значение функции = -0.00004662
3.2.3. Задача с использованием метода касательных
Задача 3.6. Разработать схему алгоритма и программу решения нелинейного уравнения f (x) ex 10sin x на отрезке [0, 1] методом касательных с погрешностью не более 0,005.
Решение задачи
Схема алгоритма решения задачи представлена на рис. 3.6.
Пояснения к схеме алгоритма
Обозначения:
Xn, Xk – значения левой и правой границ отрезка, на котором производится поиск корней нелинейного уравнения;
e – значение погрешности;
F(Xk), F(Xn), F(X) – значения функции нелинейного уравнения f (x) ex 10sin x соответственно в точках Хk, Хn, Х;
144
FP1(Xn), FP1(Xk) – значения первой производной функции нелинейного уравнения f (x) ex 10sin x соответственно в точках Хn, Xk; FP2(Xn) – значение второй производной функции нелинейного
уравнения f (x) ex 10sin x в точке Хn;
X1 – значение корня на предыдущей итерации цикла. Символ 1. Начало алгоритма.
Символ 2. Присвоение переменным границы отрезка (Xn, Xk), переменной Х и переменной погрешности вычислений (e) начальных значений.
Символ 3. Присвоение переменной Х1 предыдущего приближения к корню уравнения.
Символ 4. Проверка знаков функции и второй производной в точке Xn. Если выражение F(Xn)∙FP2(Xn) > 0, следовательно, функция и вторая производная в точке Xn имеют одинаковые знаки и в этом случае выполняется символ 5. Если выражение F(Xn)∙FP2(Xn) ≤ 0, следовательно, функция и вторая производная в точке Xn имеют разные знаки и в этом случае выполняется символ 6.
Символ 5. Вычисление нового приближения к корню уравнения (Х) путем построения касательной в точке Xn.
Символ 6. Вычисление нового приближения к корню уравнения (Х) путем построения касательной в точке Xk.
Символ 7. Проверка знаков функции на концах отрезка [X, Xn]. Если выражение F(X)∙F(Xk) < 0, то на этом отрезке функция меняет знак и имеется корень; в этом случае выполняется символ 8. Если выражение F(X)∙F(Xk) ≥ 0, то функция на концах отрезка имеет одинаковый знак и, значит, корня на этом отрезке нет; в этом случае выполняется символ 9.
Символ 8. Присвоение переменной начала отрезка (Xn) значения Х. Символ 9. Присвоение переменной конца отрезка (Xk) значения Х. Символ 10. Вывод результатов на экран.
Символ 11. Проверка условия окончания вычислений: разница между текущим и предыдущим приближениями к корню уравнения меньше погрешности (e). Если условие верно, то выполняется сим-
вол 12, иначе – символ 3.
Символ 12. Конец алгоритма.
145
|
1 |
Начало |
|
|
2 |
|
|
|
|
|
|
|
Xn=0 Xk=1 |
|
|
|
|
e=0.0005 |
|
|
|
X=10 |
|
|
3 |
|
|
|
|
X1=X |
|
нет |
4 |
F(Xn)· |
да |
6 |
|
FP2(Xn)>0 |
5 |
X=Xk-F(Xk)/ |
|
X=Xn-F(Xn)/ |
|
FP1(Xk) |
|
|
FP1(Xn) |
нет 7 |
F(X)· |
да |
|
9 |
|
F(Xk)<0 |
8 |
|
|
||
Xk=X |
|
|
Xn=X |
|
10 |
Вывод |
|
|
|
Xn, Xk, |
|
|
|
F(X) |
|
нет 11 |
|X1-X|<e |
|
|
|
|
|
|
|
12 |
да |
|
|
|
Конец |
|
|
|
|
Рис. 3.6 |
|
|
|
Программа |
Program Kasat;
Uses Crt;
Var
Xn, Xk, X, X1, e : Real;
Определение точки для проведения касательной - точка, где знаки функции и второй производной в точке Xn совпадают
Определение отрезка для поиска корня - знаки функции на границах отрезка должны быть различными
Выполнять поиск корня в цикле, пока разница между корнями текущей (X) и предыдущей итераций (X1) больше погрешности (e)
146
{вычисление значения функции}
Function F(X : Real) : Real;
Begin |
{начало раздела операторов функции F} |
F := Exp(X) - 10*sin(X); |
|
end; |
{конец функции F} |
{вычисление значения первой производной функции}
Function FP1(X : Real) : Real;
Begin |
{начало раздела операторов функции FP} |
FP1 := Exp(X) - 10*cos(X); |
|
end; |
{конец функции FP1} |
{вычисление значения второй производной функции}
Function FP2(X : Real) : Real;
Begin |
{начало раздела операторов функции FP2} |
FP2 := Exp(X) + 10*sin(X); |
|
end; |
{конец функции FP2} |
Begin |
{начало раздела операторов основной программы} |
ClrScr; |
{функция очистки экрана} |
Xn := 0; Xk := 1;{задание границ отрезка} |
|
e := 0.0005; |
{значение погрешности вычислений} |
X := 10; |
|
Repeat |
{начало цикла} |
X1 := X; |
{сохранение корня предыдущей итерации} |
{определение точки для проведения касательной - знаки функции и второй производной должны совпадать}
If F(Xn)*FP2(Xn) > 0 Then X := Xn - F(Xn)/FP1(Xn) Else X := Xk - F(Xk)/FP1(Xk);
{определение отрезка–знаки функции на концах отрезках различны}
If F(X)*F(Xk)<0 Then Xn:=X {отрезок для анализа [X,Xk]}
Else Xk:=X;{отрезок для анализа [Xn,X]}
Writeln(' Xn = ', Xn :8:8, ' Xk = ', Xk :5:3, ' Значение
функции = ', F(X):13:11); |
{вывод результатов на экран} |
{конец цикла–разница между корнями < погрешности} |
|
Until Abs(X-X1) < e; |
|
End. |
{ конец программы} |
Результат работы программы
Xn = 0.11111111 Xk = 1.000 Значение функции = 0.00869278363 Xn = 0.11209660 Xk = 1.000 Значение функции = 0.00000108286 Xn = 0.11209672 Xk = 1.000 Значение функции = 0.00000000000
147
3.3. Аппроксимация табличных данных методом наименьших квадратов
Задача 3.7. Разработать схему алгоритма и программу аппроксимации функции, заданной таблично, методом наименьших квад-
ратов с помощью полинома второй степени F(x) |
a |
a x |
a x2 . |
|||||||||
|
|
|
|
|
|
|
|
|
0 |
1 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
x |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
|
7 |
|
8 |
10 |
F(x) |
–1 |
1 |
5 |
17 |
31 |
49 |
71 |
|
97 |
|
112 |
144 |
Решение задачи
Формульный аппарат аппроксимации методом наименьших квадратов описан в прил. 2.
|
|
|
|
|
|
|
|
t0 |
10; |
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t1 |
|
xi |
0 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
10 |
46; |
|
|
|
|
|
i |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t2 |
|
xi2 |
02 |
12 |
22 |
32 |
42 |
52 |
62 |
72 |
82 |
102 |
304; |
|||
|
i |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
t3 |
|
xi3 |
03 |
13 |
23 |
33 |
43 |
53 |
63 |
|
73 |
83 |
103 |
2296; |
||
|
i |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
xi4 |
04 |
14 |
24 |
34 |
44 |
|
54 |
64 |
|
74 |
84 |
104 |
|
||
t4 |
|
|
|
18772; |
||||||||||||
i |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c0 |
|
yi |
|
1 |
1 |
5 |
17 |
31 |
|
49 |
71 |
97 112 |
144 |
526; |
||
|
|
i 1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c1 |
xi yi |
0 ( 1) 1 1 2 5 3 17 4 31 5 49 6 71 7 97 |
||||||||||||||
i |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 112 |
10 144 |
3872; |
|
|
|
|||||
148
|
10 |
|
|
|
|
|
|
c2 |
xi2 yi 02 ( 1) 12 1 22 5 32 17 42 31 52 49 62 71 |
||||||
|
i 1 |
|
|
|
|
|
|
|
72 |
97 |
82 |
112 |
102 |
144 |
30772. |
Таким образом, линейная система имеет вид
10a0 46a1 304a2 526; 46a0 304a1 2296a2 3872;
304a0 2296a1 18772a2 30772.
Для решения полученной линейной системы используется метод Гаусса (п. 3.1.3). Схема алгоритма решения задачи представлена на рис. 3.7.
Программа
Program Approksim;
Type
Tablica = Array [1..3, 1..4] of Real; Colonka = Array [1..3] of Real;
Var
I : Byte;
T0, T1, T2, T3, T4, C0, C1, C2 : Integer; X, Y : Array[1..10] of Integer;
A : Tablica;
XK : Colonka;
{функция вычисления корней системы уравнений методом Гаусса}
Procedure Gauss(Koef : Tablica; Count : Byte;
Var X: Colonka; Var flag_virogdena : Boolean);
Var
…
Begin {начало раздела операторов процедуры Gauss} {текст программы функции представлен в разделе 3.1.3}
End; |
{конец функции Gauss} |
|
Begin |
{начало раздела операторов основной программы} |
|
T0 := |
10; |
|
For I |
:= 1 to 10 do |
{цикл по всем точкам} |
Begin |
|
{начало цикла} |
Write('Введите значения X, Y для точки ', I, ‘: ’);
Readln(X[I], Y[I]); {чтение значений X[I], Y[I]}
{вычисление коэффициентов T1, T2}
149
T1 := T1+X[I]; T2 := T2 + X[I]*X[I]; |
|
|||
T3 := T3 + X[I]*X[I]*X[I]; |
{вычисление коэффициента T3} |
|||
T4 := T4 + X[I]*X[I]*X[I]*X[I]; {вычисление коэффициента T4} |
||||
{вычисление коэффициентов С0, С1, С2} |
|
|||
C0:=C0 + Y[I]; |
C1:=C1 + X[I]*Y[I]; |
|
||
C2:=C2 + X[I]*X[I]*Y[I]; |
|
|
||
end; |
|
|
{конец цикла} |
|
{коэффициенты |
1-го уравнения системы} |
|
||
A[1, 1]:=T0; |
A[1, 2]:=T1; |
A[1, 3]:=T2; |
A[1, 4]:=C0; |
|
{коэффициенты |
2-го уравнения системы} |
|
||
A[2, 1]:=T1; |
A[2, 2]:=T2; |
A[2, 3]:=T3; |
A[2, 4]:=C1; |
|
{коэффициенты |
3-го уравнения системы} |
|
||
A[3, 1]:=T2; |
A[3, 2]:=T3; |
A[3, 3]:=T4; |
A[3, 4]:=C2; |
|
Gauss(A, 3, XK, B);{вычисление корней системы уравнений} |
||||
{вывод значений корней} |
|
|
||
If not B Then for I :=1 to 3 do |
|
|||
|
|
Writeln(‘x’,I, ‘ = ’, XK[I]:5:2) |
||
Else Writeln(‘Система не имеет решения.’); |
||||
End. |
|
{конец основной программы} |
||
Результат работы программы
Введите значения X, Y для точки 1: 0 -1 Введите значения X, Y для точки 2: 1 1 Введите значения X, Y для точки 3: 2 5 Введите значения X, Y для точки 4: 3 17 Введите значения X, Y для точки 5: 4 31 Введите значения X, Y для точки 6: 5 49 Введите значения X, Y для точки 7: 6 71 Введите значения X, Y для точки 8: 7 97 Введите значения X, Y для точки 9: 8 112 Введите значения X, Y для точки 10: 10 144 x1 = -7.86
x2 = 7.66
x3 = 0.83
Пояснения к схеме алгоритма
Обозначения:
X[I], Y[I] – массивы значений x и F(x) (заданные таблично); Gauss(A, 3, XK, B) – вызов процедуры Gauss для вычисления
корней системы уравнений с тремя переменными методом Гаусса; входными параметрами процедуры являются: матрица коэффициентов системы А, число уравнений системы 3, выходными параметра-
150
