Лабораторная работа № 1 Метод наименьших квадратов (МНК) Цель: исследование метода, разработка программы реализации. В различных исследованиях приходится использовать формулы, составленные на основании эксперимента. Одним из лучших способов получения таких формул является метод наименьших квадратов. Пусть на основании эксперимента необходимо установить функциональную зависимость между двумя переменными величинами xi и yi. Для получения таблицы экспериментальных точек, воспользуемся формулой: yi = Axi2 + Bxi + C + 0.12·Sin(K(xi + 1)), I = 1, 2, 3, … , N xend xstart xi = xstart + ·i , где xstart = 0, xend = 2.0, h = 8 h A = 0.35 + 0.05·Sin(n) n = 9 – номер в списке группы B = 0.45 + 0.05·Sin(m) m = 1 – номер группы C = 0.5 + 0.3·Sin(n) K = 10 + m По результатам измерений составим таблицу в Microsoft Excel. x Из представленной таблицы следует: x0 = 0 y0 = 0.69167 x1 = 0.25 y1 = 0.864906 x2 = 0.5 y2 = 1.086789 x3 = 0.75 y3 = 1.355492 x4 = 1 y4 = 1.669159 x5 = 1.25 y5 = 2.026016 x6 = 1.5 y6 = 2.424487 x7 = 1.75 y7 = 2.863286 x8 = 2 y8 = 3.341503 y 0 0,69167 0,25 0,864906 0,5 1,086789 0,75 1,355492 1 1,669159 1,25 2,026016 1,5 2,424487 1,75 2,863286 2 3,341503 Блок - схема начало конец xstart xend i<8 i = i+1 h yi = Axi2 + Bxi + C + 0.12*Sin(K(xi + 1)) i=1 n, m i=0 xi = xstart+ (xend - xstart /h)*i A = 0.35+0.05*Sin9 = 0.357 B = 0.45+0.05*Sin1 = 0.451 C = 0.5+0.3*Sin9 = 0.546 K = 10+1 = 11 i<8 i = i+1 Установим теперь вид функции y = f(x) по характеру расположения на координатной плоскости экспериментальных точек. Пусть точки расположены как на рисунке. 4 3,5 3 2,5 y 2 1,5 1 0,5 0 0 0,5 1 1,5 2 2,5 x В данном случае естественно предположить, что между x и y существует линейная зависимость, выражающаяся формулой: y = ax + b Так как точки (x1; y1), (x2; y2), …, (xn, yn) не лежат точно на прямой, а лишь вблизи нее, то формула y = ax + b и является приближенной. Поэтому подставляя значения координат точек в выражение y – (ax+b), получаем равенства y1 – (ax1 + b) = 1 , y1 – (ax1 + b) = 2 , … y1 – (ax1 + b) = т , где 1 , 2 ,…, т — некоторые числа, которые назовем погрешностями. Поставим задачу подобрать коэффициенты а и b таким образом, чтобы эти погрешности были возможно меньше по абсолютной величине. Для решения этой задачи воспользуемся методом наименьших квадратов. Рассмотрим сумму квадратов погрешностей n n i 1 i 1 S (a, b) [ yi (axi b)] 2 i2 . Здесь xi и yi — заданные числа (находятся по формулам), а коэффициенты a и b , при которых функция S(a, b) имеет минимум, неизвестные числа, подлежащие определению. То есть функцию S( a, b) можно рассматривать как функцию двух переменных a и b и исследовать ее на экстремум. Таким образом, задача свелась к нахождению значений a и b, при которых функция S(a, b) имеет минимум. Имеем: n dS 2 [ yi (axi b)]xi , da i 1 n dS 2 [ yi (axi b)] db i 1 Приравнивая эти частные производные к нулю, получаем линейную систему двух уравнений с двумя неизвестными a и b: n n y i a xi bn , i 1 i 1 n n n 2 y i x i a x b xi i i 1 i 1 i 1 Эта система называется нормальной системой метода наименьших квадратов. Из этой системы находим числа а и b и затем, подставив в уравнение искомой прямой, получаем ее. Тот факт, что функция S(a, b) в найденной точке имеет минимум, направленный точкой M( a, b), легко устанавливается с помощью частных производных второго порядка. Имеем n d 2S d 2S d 2S 2 2n . 2 xi , 2 xi , dadb db 2 da 2 i 1 Следовательно, n n d 2S d 2S d 2S 2 2 2 ( ) 4 n x ( 2 xi ) 2 i dadb da db 2 i 1 i 1 n n Это выражение можно записать в виде 2 ( xi xj ) 2 , отсюда следует, что 0 . i 1 j 1 2 d S 0 , то в точек M(a, b) функция S(a, b) имеет минимум. da 2 Рассмотрим более подробно нашу задачу. Обозначим: S0 = n S1 = xi Так как x T y T1 = x y S2 = 2 i 0 i i i a= S 0T 1 S 1T 0 S 0 S 2 (S 1) 2 , b= T 0 S 2 S 1T 1 S 0 S 2 (S 1) 2 Необходимо найти y' = a + bxi; переменная x остается, y — новый. x y0 = 0.484342 y0 = 0.816681 y0 = 1.149021 y0 = 1.481361 y0 = 1.813701 y0 = 2.146041 y0 = 2.478381 y0 = 2.810722 y0 = 3.143061 y’ y 0 0,69167 0,484342 0,25 0,864906 0,816681 0,5 1,086789 1,149021 0,75 1,355492 1,481361 1 1,669159 1,813701 1,25 2,026016 2,146041 1,5 2,424487 2,478381 1,75 2,863286 2,810721 2 3,341503 3,143061 S0 = 0 S1 = 0 S2 = 0 S0 = 1 S1 = 9 S2 = 81 T0 = 16.319 T1 = 146.81 a = 1.33 b = 0.48 начало S0 = 0 i=1 i = i+1 i<8 конец S0 = S0 + 1 S1 = S1 + x(i) S2 = S2 + x(i)*x(i) T0 = T0 + y(i) T1 = T1 + x(i)*y(i) a = (S0 * T1 – S1 * T0)/(S0 * S2 – (S1)2 b = (T0 * S2 – S1 * T1)/(S0 * S2 – S1 *S1 После выше указанных вычислений получаем искомый результат: 4 3,5 3 2,5 2 1,5 1 0,5 0 0 0,5 1 1,5 2 2,5 Программный код: Sub Table() 'начало программы Dim x() As Single ' декларация переменных Dim y() As Single Dim y1() As Single n = CInt(InputBox("Введите номер фамилии")) m = CInt(InputBox("Введите номер группы")) x_start = CSng(InputBox("Введите x0")) ' начальная координата точки x_end = CSng(InputBox("ВВедите xk")) ' конечная координата точки h = CInt(InputBox("Input chislo otrezkow")) ReDim x(1 To h + 1) As Single 'объявление динамического массива ReDim y(1 To h + 1) As Single ReDim y1(1 To h + 1) As Single For i = 1 To h + 1 'заголовок цикла x(i) = x_start + ((x_end - x_start) / h) * (i - 1) ' тело цикла Worksheets(1).Cells(i, 1).Value = x(i) Next i ' выход из цикла a = 0.35 + 0.05 * Sin(n) b = 0.45 + 0.05 * Sin(m) C = 0.55 + 0.5 * Sin(n) k = 10 + m For i = 1 To h + 1 'начало цикла y(i) = a * x(i) ^ 2 + b * x(i) + C + 0.12 * Sin(k + (x(i) + 1)) Worksheets(1).Cells(i, 2).Value = y(i) Next i ' выход из цикла S1 = 0 S2 = 0 S0 = 0 For i = 1 To h + 1 ' начало цикла x(i) = Worksheets(1).Cells(i, 1).Value y1(i) = Worksheets(1).Cells(i, 2).Value S0 = S0 + 1 S1 = S1 + x(i) S2 = S2 + x(i) * x(i) T0 = T0 + y(i) T1 = T1 + x(i) * y(i) Next i ' выход из цикла a = (S0 * T1 - S1 * T0) / (S0 * S2 - (S1) ^ 2) b = (T0 * S2 - S1 * T1) / (S0 * S2 - S1 * S1) Worksheets(2).Cells(15, 1).Value = a Worksheets(2).Cells(15, 2).Value = b For i = 1 To h + 1 ' начало цикла y1(i) = a * x(i) + b Worksheets(2).Cells(i, 1).Value = x(i) Worksheets(2).Cells(i, 2).Value = y(i) Worksheets(2).Cells(i, 3).Value = y1(i) Next i ' выход из цикла End Sub ' конец программы Вывод: написана программа, которая при вводе номера фамилии студента, его группы, начальной и конечной координаты x и числа отрезков позволяет построить прямую методом наименьших квадратов. Лабораторная работа №2 Интерполяционный полином Лагранжа Целью данной работы является частный случай регрессивного анализа — линейная регрессия. Задача: для данных значений x = x1, x = x2,… x = xn (x1< x2<… xn) и y = y1, y = y2,… y = yn найти многочлен F(x) = L(x) степени (n – 1), удовлетворяющий условиям: F(x1) y1, F(x2) y2, (1) F(xn) yn Решение: рассмотрим конструкцию вида ( x x 2)( x x3)...( x xn 1)( x xn) F1(x) = y1 (2) ( x1 x 2)( x 2 x3)...( x1 xn 1)( x1 xn) Числитель дроби (2) состоит из произведения (n-1) сомножителей вида (x…xi), i = 1,2, …, n, а значит, является многочленом степени (n – 1). Числа x2, x3,… xn — корни этого многочлена, то есть F1(xi) = 0, i = 1, 2…,n. Причем, по построению F1(xi) = y1. Таким образом, график этого многочлена проходит через точку с координатами (x1, y1) и обращается в нуль во всех других узлах интерполяции i = T0. Точно так же строятся и другие многочлены: (x - x1)...(x - xi - 1)(x - xi 1)...(x - xn) Fi(x) = (xi - x1)...(x i - xi - 1)(x i - xi 1)...(x i - xn) yi (3) Fn(x) = (x - x1)(x - x2)...(x - xn - 1) ( xn x1)( xn x 2)...( xn xn 1) n Сумма всех этих многочленов F(x) = Ln-1(x)= Fi ( x) (4), где каждая Fi(x) определяется i 1 из системы (3) и называется интерполяционным полиномом (или интерполяционной формулой) Лагранжа, который удовлетворяет условию (1) исходной задачи по построению. Докажем методом «от противоположного» единственность существования многочлена (4). По построению Fi(x) = Ln-1, то есть является многочленом степени (n-1), а значит, имеет не более (n-1) корней. Пусть существует еще один ( y ) Ln 1 , удовлетворяющий условию (1). Тогда разность R(x) = F(x) - (x) также является многочленом L, степень которого не выше (n-1). Однако по построению многочлена R(x) имеет n корней в точках x1, x2, …, xn, так как в них разность R(xi) = F(xi) - ( xi ) = yi – yi, i =1,…,n. Но это противоречие не может быть n корней y многочлена, степень которого ниже n. Таким образом, R(x) 0, откуда F(x) (x) . Тем самым единственность существования полинома Лагранжа доказана. Очевидная громоздкость интерполяционной формулы (4) с лихвой компенсируется легкостью его программирования на ЭВМ. Например, Бейсик — реализация алгоритма Лагранжа имеет вид: Sub Lagr() 'название программы Dim X(1 To 100) As Single 'описание массива иксов Dim Y(1 To 100) As Single 'описание массива игреков Dim ax As Single 'аргумент Dim K As Integer, N As Integer, j As Integer 'рабочие переменные Dim P, S As Single 'Р-произведение, S- сумма N = CInt(InputBox("Ввод числа узлов интерполирования")) 'ввод числа узлов интерполирования Worksheets(1).Activate 'активация первого листа For K = 1 To N 'цикл забора данных с лист Excel X(K) = Worksheets(1).Cells(1, K).Value 'забор иксов Y(K) = Worksheets(1).Cells(2, K).Value 'забор игреков Next K 'конец цикла забора данных l = 1 'счетчик кол-ва введенных аргументов 1: 'метка перехода к подсчету следующего аргумента ax = CSng(InputBox("Введите аргумент")) 'ввод аргумента If ax = 99999 Then GoTo mend 'условие лимита ввода аргументов S = 0 'переменная накопления суммы For K = 1 To N 'цикл накопления суммы P = 1 'переменная накопления произведения For j = 1 To N 'цикл накопления произведения If j = K Then GoTo 13 'условие убирающее действие приводящее к делению на 0 P = P * (ax - X(j)) / (X(K) - X(j)) 'накопление произведения 2: 'метка перехода при делении на 0 Next j 'выход из цикла накопления произведения S = S + P * Y(K) 'накопление суммы Next K 'выход из цикла накопления суммы Worksheets(1).Cells(1, N + 1 + l).Formula = ax 'вывод на лист значения аргумента Worksheets(1).Cells(2, N + 1 + l).Formula = S 'вывод на лист координату Y по введенному аргументу l = l + 1 'увеличение счетчика GoTo 1 'переход к следующему вводу аргумента mend: 'метка перехода к концу программы End Sub 'конец программы Блок – схема начало N K = K +1 K=1 x(k) = Worksheets(1).Cells(1,k).Value y(k) = Worksheets(1).Cells(1,k).Value KN Worksheets(1).Cells(1,N+1+l).Formula =S Worksheets(1).Cells(1,N+1+l).Formula = ax KN l=l+l K = K+1 l=1 ввод ax ax=99999 конец S=0 S = S + P * y(k) K=1 JN P = P*(ax – x(J)/x(k) – x(1) J=J+l J=K P=1 J=1 Недостатком интерполяционной формулы Лагранжа является превышение точности — мы осуществляем вычисление значения полученной точности полным полиномом степени (n – 1), хотя в большинстве случаев достаточно ограничиться более простыми приближениями: линейной параболической интерполяцией, то есть полиномами L1(x), L2(x), L3(x) с соответствующим использованием двух, трех, четырех узлов интерполяции, которых зачастую вполне достаточно для достижения требуемой для данной конкретной задачи точности вычисления значения. x y 1 1 2 2 4 1 ( x x2 )( x x3 ) y1 ( x1 x2 )( x1 x3 ) ( x x1 )( x x3 ) F2(x new y2 2 ) = ( x2 x1 )( x2 x3 ) ( x x1 )( x x2 ) F3(x 3new ) = y3 ( x3 x1 )( x3 x2 ) F1(x 1new ) = y 1new = F (i) (1.1 2)(1.1 4) ·1 = 0.87 (1 2)(1 4) (1.1 1)(1.1 4) F2(1.1) = ·2 = 0.29 (2 1)( 2 4) (1.1 1)(1.1 2) F3(1.1) = ·1 = -0.015 (4 1)( 4 2) F1(1.1) = y 1new = 1.145 … (3.9 2)(3.9 4) ·1 = -0.19 (1 2)(1 4) (3.9 1)(3.9 4) F2(3.9) = ·2 = 0.29 (2 1)( 2 4) (3.9 1)(3.9 2) F3(3.9) = ·1 = -0.048 (4 1)( 4 2) F1(3.9) = y 1new = 1.12 Вывод: написана программа, которая по числу N узлов интерполирования, при вводе аргумента ax подсчитывает значения функции (ищет y), используя интерполяционный полином Лагранжа. Лабораторная работа №3 Интерполяционная схема Эйткена Цель: исследование интерполяционной схемы Эйткена, разработка программы. Если значения xi неравностоящие и требуется найти не общее выражение Ln(x), а лишь его значения при некоторых x, то удобно пользоваться интерполяционной схемой Эйткена. По этой схеме значение интерполяционного многочлена для какого – то значения x находится путем последовательного применения единообразного процесса. Рассмотрим выражение: y 0 x0 - x L01(x) = y 1 x1 - x x1 x0 Это многочлен первой степени относительно x. При x = x0 получим: y0 0 L01(x0) = y 1 x1 - x 0 x1 x0 = y0 Аналогично при x = x1 будем иметь: y0 x0 - x1 L01(x) = y1 0 x1 x0 = y1 Так как многочлен первой степени, принимающий в точках x0 и x1 значения y0 и y1, единстве6нный, то L01(x0) и решаем задачу интерполяции по двум данным. Точно так же мы сможем образовать L12(x0), L23(x0) и т.д. Рассмотрим далее, L01 ( x) x0 x L012(x0) = L12 ( x) x 2 - x x 2 x0 Это многочлен второй степени относительно x. При x = x0 будем иметь: L01(x0) = y0 0 1 =y0 x 2 x0 L12(x 0 ) x 2 x0 При x = x1 получим: L012(x1) = 1 x 2 x0 y1 x0 x1 y1 x 2 x1 =y1, а при x = x2 L012(x2) = L01 ( x2 ) 1 x 2 x0 y 2 0 x0 x 2 =y2. Следовательно, L012(x2) совпадает с интерполяционным многочленом Лагранжа, принимающим в точках x0, x1, x2 соответственно y0, y1, y2. Вообще, L012…n(x) = L012...( n1) ( x) x0 x 1 x n x0 L012... n ( x) xn x1 Будет интерполяционным многочленом Лагранжа, принимающим в точках x0, x1,…, xn соответственно y0, y1,…, yn . Очевидно, что порядок и нумерация точек при этом не имеют. Каждый многочлен L012…k(x) получается из L012…k-1(x) и L012…k(x) так же, как и L01(x) получается из y0 и y1. Вычислительная схема для получения значения интерполяционного многочлена будет выглядеть следующим образом: xi x0 x1 x2 x3 x4 x5 yi y0 y1 y2 y3 y4 y5 xi - x x0 - x x1 - x x2 - x x3 - x x4 - x x5 - x Li-1,i L01(x) L02(x) L03(x) L04(x) L05(x) Li-2,i-1,i L012(x) L123(x) L234(x) L345(x) Li-3,i-2, Li-4,i-3,i-2, i-1,i i-1,i L0123(x) L1234(x) L2345(x) L01234(x) L12345(x) Интересно то, что, применяя последнюю схему, мы можем постепенно подключать все новые и новые значения xi до тех пор, пока сами вычисления не покажут нам, что точность уже не возрастает. Интерполяционный процесс Эйткена характерен своим единообразием. Предположим, что нам дана таблица: x x1 x2 x3 y y1 y2 y3 Проделаем следующие операции: 1. Упорядочим по x. 2. Составим многочлен Лагранжа для двух первых точек: y1 ( x x1 ) ( x x2 ) 1 y1 y2 ( x1 x2 ) ( x2 x1 ) x2 x1 y 2 3. Составим многочлен Лагранжа для следующих двух точек: y2 ( x x3 ) ( x x2 ) 1 L23 = y2 y3 ( x 2 x3 ) ( x3 x 2 ) x3 x 2 y 3 L12 = x1 x x2 x x2 x x3 x 4. Составим многочлен Лагранжа для следующих трех точек: ( x x2 )( x x3 ) ( x x1 )( x x3 ) ( x x2 )( x x1 ) L123 = y1 y2 y3 ( x1 x2 )( x1 x3 ) ( x2 x1 )( x2 x3 ) ( x3 x2 )( x3 x1 ) 5. Выпишем второе слагаемое: ( x x1 )( x x3 ) ( x x1 ) ( x x)( x3 x) ( x x)( x3 x) = 1 y2 3 y2 1 y2 ( x2 x1 )( x2 x3 ) ( x3 x1 ) ( x3 x1 )( x2 x1 ) ( x3 x1 )( x3 x2 ) 6. Получаем общую формулу: 1 L123(x) = (L12(x3 – x1) – L23(x1 – x)) ( x3 x1 ) Программный код: Sub СхемаЭйткена() Dim x(1 To 50) As Single 'массив для хранения координаты х точек Dim y(1 To 50) As Single 'массив для хранения координат у точек Dim n As Integer 'число узлов интерполяции Dim i As Integer 'счетчик Dim j As Integer 'счетчик Dim p(100, 100) As Single 'массив для хранения интерполяционных многочленов Dim w As Integer 'счетчик для перехода от Р12 к Р123 и т.д. Dim z As Single 'переменная для запоминания промежуточных точек Dim q As Integer 'переменная для перехода к следующим ячейкам на листе Dim b As Integer 'переменная для счета промежуточных точек Dim m As Integer 'число промежуточных точек Dim d As Single 'шаг Dim h As Integer 'счетчик Worksheets(1).Cells(1, 1).Value = "Схема Эйткена" 'выводим пояснения на экран Worksheets(1).Cells(2, 1).Value = "Исходные данные" Worksheets(1).Cells(3, 1).Value = "x(i)" Worksheets(1).Cells(4, 1).Value = "y(i)" Worksheets(1).Cells(5, 1).Value = "Результат" Worksheets(1).Cells(6, 1).Value = "x(i)" Worksheets(1).Cells(7, 1).Value = "y(i)" q = 2 ' начинаем вывод со второй ячейки n = CInt(InputBox("введите число узлов интерполяции")) ' вводим число узлов For i = 1 To n ' считываем координаты узлов с листа1 в массивы x(i) = Worksheets(1).Cells(3, i + 1).Value y(i) = Worksheets(1).Cells(4, i + 1).Value Next i m = CInt(InputBox("введите число промежуточных точек")) ' вводим число промежуточных точек For h = 1 To (n - 1) ' высчитываем координаты промежуточных точек z = x(h) ' запоминаем координату х узла b = 0 ' число выбранных промежуточных точек d = (x(h + 1) - x(h)) / (m + 1) ' считаем шаг 5 z = z + d ' высчитываем координату х промежуточной точки b = b + 1 ' увеличиваем счетчик числа промежуточных точек j=2 For i = 1 To (n - 1) ' высчитываем значения Р12,Р23,и т.д. p(i, j) = (y(i) * (x(j) - z) - y(j) * (x(i) - z)) / (x(j) - x(i)) j=j+1 Next i For w = 1 To (n - 2) ' высчитываем Р123,Р234,Р345,и т.д.,затем, Р1234,Р2345 и т.д. j=2+w ' в зависимости от числа промежуточных точек For i = 1 To (n - w - 1) p(i, j) = (p(i, j - 1) * (x(j) - z) - p(i + 1, j) * (x(i) - z)) / (x(j) - x(i)) j=j+1 Next i Next w Worksheets(1).Cells(6, q).Formula = z ' выводим высчитанные координаты на лист1 Worksheets(1).Cells(7, q).Formula = p(1, n) q = q + 1 ' переходим к следующей ячейке If b = m Then GoTo 2 ' если высчитали координаты всех промежуточных точек 'между двумя узлами, то переходим к следующему узлу GoTo 5 'иначе переходим к следующей промежуточной точке 2 Next h End Sub Блок - схема Начало q=2 Вводим n h n 1 b=m Коне ц WorkSheets (1). Cells (6, q). Value = z WorkSheets (1). Cells (7, q). Value = L (1, n) i=1 i=i+ 1 q=q+1 w n2 (xi) WorkSheets (1). Cells (3, i + 1). Value (yi) WorkSheets (1). Cells (4, i + 1). Value i n w 1 in i=i+1 wn – 2 m i=1 n=1 w=w+1 z = x (h) b = 0; d = (x (h + 1) – x (h)) / (m + 1) j=2+w w=1 z=z+d b=b+1 j=2 i=1 i n 1 L (i, j) = (y (i) * (x (j) – z ) – y (i) * (x(i) – z)) / (x (j) – x (i)) j=j+1 Вывод: написана программа, которая по числу N узлов интерполирования и m числу промежуточных точек подсчитывает значения функции по интерполяционной схеме Эйткена. Схема Эйткена Исходные данные 1 2 x 1 2 y 4 1 Результат 1.166 x(i) 1.236 y(i) 1.333 1.444 1.5 1.625 Y 1.666 1.777 1.833 1.902 2.333 2.111 2.666 2.111 3 2 3.333 1.777 3.666 1.444 схема Эйткена 2,5000 2,0000 1,5000 1,0000 0,5000 0,0000 0 1 2 3 4 5 X Лабораторная работа №4 Метод Ньютона - Рафсона Метод Ньютона – Рафсона является общим и применимым к решению очень широкого класса нелинейных операторных уравнений. Значение его заключается в том, что он позволяет привести решение нелинейных уравнений к решению последовательности линейных задач. Достигается это при помощи выделения из нелинейного уравнения его главной части. Методом Ньютона – Рафсона вычислим: 1 A (( N 1) x N 1 ) x = n A по формуле x = N x Блок – схема Начало Вводим A, N, l, x 0 K=0 x (( N 1) * x0 A x0 ^ ( N 1) / N Abs( x x0 ) >= l K=K+1 x0 x WorkSheets (1). Cells (9, 2). Value = x WorkSheets (1). Cells (10, 2). Value = K Конец Программный код: Sub Ньют_Раф() ' название программы Dim A As Single 'А-аргумент Dim N As Integer 'N-степень Dim k As Integer 'к-количество итераций Dim e As Single 'е-погрешность Dim x0 As Single 'x0-начальное приближение Dim x As Single 'x-корень A = Worksheets(1).Cells(4, 2).Value N = Worksheets(1).Cells(5, 2).Value e = Worksheets(1).Cells(6, 2).Value x0 = Worksheets(1).Cells(7, 2).Value k=0 metka: x = ((N - 1) * x0 + A / x0 ^ (N - 1)) / N If Abs(x - x0) >= e Then k=k+1 x0 = x GoTo metka Else Worksheets(1).Cells(9, 2).Formula = x Worksheets(1).Cells(10, 2).Formula = k End If End Sub Результат: Аргумент 16 Степень 2 Погрешность 0.001 Начальное приближение 1 Ответ 4 Количество итераций 5 Лабораторная работа №5 Решение нелинейных уравнений. Пусть f (x) – полином (многочлен) или трансцендентная функция одной переменной. Задача состоит в том, чтобы найти один или более нулей функции f (x), то есть решить уравнение f (x) = 0 (1) Пусть функция f (x) определена и непрерывна в некотором конечном или бесконечном интервале С1 x C2 . Всякое значение , обращающее функцию f (x) в ноль, то есть такое, что f ( ) = 0, называется корнем уравнения (1) или нулём функции f (x). Процесс вычисления корней проводится в два этапа: 1) Локализация корня; 2) Нахождение корня численным методом. Локализовать (отделить) корень, значит указать промежуток на горизонтальной оси координат, где находится один и только один корень уравнения (1). Мы будем считать, что корень локализован. При нахождении приближенного значения корня с заданной погрешностью дело сводится к построению последовательности чисел x k , сходящейся к корню x * . Такие процедуры называются итеративными. Начальное значение называют нулевым. Метод половинного деления (метод дихотомии). Предположим, что корень отделён на отрезке [a;b]и знаки и f(b) различны (функция f(x) меняет знак при переходе через корень x*). Положим a0= a и b0=b и вычислим значения функции в левом конце отрезка, f(a0), и в его середине c0= (a0+ b0)/2; f(c0). Сравним знаки чисел f(a0) и f(c0). Если эти знаки различны, то корень x*лежит в интервале(a0; c0); если же одинаковы, то тогда различны знаки f(b0)и f(c0), и корень лежит в интервале(c0;b0). (Возможен ещё случай; f(c0)=0, тогда корень x*= c0 уже найден.) В обоих случаях смены знака корень оказывается, отделён на отрезке (a0; c0) либо (c0;b0), длина которого ровно в два раза меньше длины исходного отрезка[a0; b0]= [a;b]. Обозначим этот отрезок половинной длины через [a1; b1] (то есть, положим, a1= a0 , b1 = c0 в случае, когда f(a0)и f(c0)разных знаков, и a1= c0; b1=b0 в случае, когда f(a0)и f(c0) одного знака). Далее повторим процесс для отрезка[a1; b1]: снова отыщем его середину c1, найдём значение функции f(c1)и сравним знак этого числа со знаком f(a1); если знаки разные, то корень отделён на [a2; b2]=[a1;c1] , если одинаковые, то на [a2; b2]=[c1; b1] (или же оказывается, что f(c1)=0; тогда корень найден). Длина отрезка, на котором отделён корень, уменьшилась ещё в два раза. Последовательное деление отрезка пополам и приближение к корню x* Поступая тем же образом и далее, получаем, что после делений длина отрезка, на котором лежит корень, сокращается в раз и становится равной (если корень не был точно определён на каком-то предыдущем этапе, то есть не совпал с ci при некотором i). Пусть -- заданная точность, с которой требуется отыскать корень. Процесс деления отрезков следует остановить, как только станет верным неравенство Очевидно, что если при этом положить . то расстояние от корня , лежащего где-то в интервале (ak ;bk ), до середины этого интервала будет не больше , то есть приближённое равенство будет выполнено с нужной точностью. Метод хорд. Если вычисление производной функции затруднено, можно заменить её отношением разности функции к разности аргумента в окрестности рассматриваемой точки f '(x) ( f(x+h) - f(x))/h. Подставляя это выражение получим xi+1 = xi - f(xi)h / (f(xi+h)-f(xi)) Геометрически это означает, что приближенным значением корня считается точка пересечения секущей, проходящей через две точки функции f(xi) и f(xi+h), с осью абсцисс. При использовании этого метода следует уменьшать величину h по мере приближения к корню. В зависимости от того, лежат ли точки xi и xi+1 по разные стороны от корня или же по одну и ту же сторону, получаем такие чертежи: Построение последовательного приближения по методу хорд: два случая. Вычисления прекращают, когда будет выполнено неравенство где - желаемая точность нахождения корня. Метод касательных (Ньютона) Пусть [a, b] – отрезок, на котором локализован корень уравнения (1) и f (x) дифференцируема на [a, b]. В начальной точке x 0 функция заменяется на касательную. Каждое значение x k 1 вычисляются как точка пересечения абсцисс с касательной. x k 1 x k f (x k ) f '(x k ) В качестве x 0 выбирают тот конец отрезка, на котором выполняется условие f ( x) * f ' ' ( x) 0 . Вычисления, заканчиваются, когда будет выполнено условие x k 1 x k . В качестве x* берём x k 1 . Метод Ньютона обладает хорошей сходимостью. Основная трудность в методе Ньютона заключается в выборе начального приближения x 0 , которое ведёт к сходящемуся итерационному процессу. Вследствие этого методу Ньютона часто предшествует какой – нибудь глобально сходящийся алгоритм типа деления пополам. Заметим, что каждая итерация метода Ньютона требует вычисления не только функции f(x), но и её производной f ' (x). Метод секущих Метод секущих заменяет производную первой разностью, найденной по двум последним итерациям. В этом алгоритме начинают с двумя исходными числами x 0 и x1 . На каждом шаге x k 1 получают как единственный нуль секущей прямой к функции f (x) проходящей через точки с абсциссами x k 1 и x k . ( x k x k 1 ) * f ( x k ) x k 1 x k f ( x k ) f ( x k 1 ) Метод секущих имеет хорошую сходимость, подобно методу Ньютона наибольшая трудность наблюдается в назначении x 0 и x1 , достаточно близких к корню для того чтобы могла начаться сходимость. Метод простой итерации Перепишем уравнение (1) в виде x (x) (2) . Выберем каким – либо способом приближённое значение корня x 0 и подставим его в правую часть уравнения (2). Получим некоторое число x1 ( x 0 ) . Подставим в правую часть этого равенства вместо x 0 число x 1 , получим новое число x 1 = ( x 0 ) . Подставим в правую часть этого равенства вместо x 0 число x 1 , получим новое число x 2 = ( x1 ) . Повторяя этот процесс будем иметь последовательность чисел x k 1 = ( x k ) (3). Если эта последовательность — сходящаяся, то предел lim x k является корнем k уравнения (2) и может быть вычислен по формуле (3) с любой степенью точности. Процесс итерации следует продолжать до тех пор, пока для двух последовательных приближений не будет выполнено неравенство 1 g x k x k 1 , g Где —заданная абсолютная точность вычисления корня. При этом должно выполняться условие: ' ( x) g на отрезке [a, b]. Поэтому переход от уравнения (1) к уравнению (2) не безразличен. Для метода простых итераций следует выбирать такое представление x (x) , при котором выполняется неравенство ' ( x) g <1, является условие сходимости метода, причем чем меньше число g, тем быстрее последовательные приближения сходятся к корню. Программный код для метода дихотомии: Function F(x As Single) As Single F = x + Log(x + 0.5) - 0.5 'Вычисление F(x) End Function Sub Dichotomy() Dim first As Single ' для графика Dim Root As Single 'корень Dim x As Single 'текущий корень в вычислении Dim a, b, f1, f2, fx As Single ' рабочие переменные Dim e As Single 'точность Worksheets(1).Cells(1, 6).Value a = CSng(InputBox("Введите a", "Dihotomy")) b = CSng(InputBox("Введите b", "Dihotomy")) e = CSng(InputBox("Введите точность", "Dichotomy", 0.0001)) a1 = a b1 = b f1 = F(CSng(a)) f2 = F(CSng(b)) Do x = (a + b) / 2 fx = F(x) If f1 * fx > 0 Then a=x f1 = fx Else b=x f2 = fx End If Loop Until Not Abs(a - b) > e Root = (a + b) / 2 c = MsgBox("Корень равен " + CStr(Root), vbOKOnly, "Dichotomy") If (((a1 - e) < Root) And (Root < (a1 + e))) Or (((b1 - e) < Root) And (Root < (b1 + e))) Then c = MsgBox("Вероятно корня на отрезке нет, т. к. он равен границе отрезка +-е", , "Дихотомия") End If 'построение графика Worksheets(1).Cells(1, 3).Value = Root Worksheets(1).Cells(1, 4).Value = (F(Root)) first = Root - 2 step = 4 / 100 For i = 1 To 100 Worksheets(1).Cells(i, 1).Value = first Worksheets(1).Cells(i, 2).Value = (F(first)) first = first + step Next i End Sub Блок – схема Начало f1: F (a) f1 * f2 > 0 HasRoot : = False x : = (a + b) / 2 f2 = F (x) f1 * f2 > 0 b: = x f1: = f2 a: = x abs (a - b) > e Конец 4 3 2 1 0 -2 -1 -1 0 -2 1 2 3 Функция Корень -3 -4 -5 -6 Программный код для метода хорд: Function F(x As Single) As Single F = x + Log(x + 0.5) - 0.5 'Вычисление F(x) End Function Sub MetodHord() Dim e As Single Dim h As Single Dim Root As Single Dim x As Single Dim x1 As Single Dim y As Single Dim fx As Single Dim first As Single Worksheets(1).Cells(1, 6).Value = "Автор: Леснова Елена" x1 = CSng(InputBox("введите начальное приближение", "Метод хорд")) h = CSng(InputBox("введите шаг", "Метод хорд")) e = CSng(InputBox("введите точность", "Метод хорд", 0.0001)) x = x1 fx = (F(x)) y = fx * h / (F(x + h) - fx) Do While Abs(y) > e x=x-y fx = F(x) y = fx * h / (F(x + h) - fx) Loop Root = x c = MsgBox("Корень равен " + CStr(Root), , "Метод хорд") 'построение графика Worksheets(1).Cells(1, 3).Value = Root Worksheets(1).Cells(1, 4).Value = (F(Root)) first = Root - 2 step = 4 / 100 For i = 1 To 100 Worksheets(1).Cells(i, 1).Value = first Worksheets(1).Cells(i, 2).Value = (F(first)) first = first + step Next i End Sub Блок- схема: Начало x : = x1 y = F (x)* h / (F (x + h) – f (x)) abs (y) x:=x–y y : = F (x) * h / (F (x + h)- f (x)) Result : = x Конец 4 3 2 1 0 -2 -1 -1 0 -2 1 2 3 Функция Корень -3 -4 -5 -6 Программный код для метода простых итераций: Sub iteration() Dim a() As Single Dim b() As Single Dim x0() As Single Dim n As Integer Dim s As Single Dim e As Single Dim x() As Single Worksheets(1).Cells(1, 7).Value n = CInt(InputBox("Введите количество уравнений")) e = CSng(InputBox("Введите точность")) ReDim a(1 To n, 1 To n) As Single ReDim b(1 To n) As Single ReDim x0(1 To n) As Single ReDim x(1 To n) As Single For i = 1 To n For j = 1 To n a(i, j) = CSng(Worksheets(1).Cells(i, j).Value) If j = n Then b(i) = CSng(Worksheets(1).Cells(i, j + 2).Value) End If Next j Next i s=0 For i = 1 To n x0(i) = CSng(InputBox("Введите х" + CStr(i) + "(0)")) Next i Do k=0 For i = 1 To n x(i) = -b(i) For j = 1 To n x(i) = x(i) + a(i, j) * x0(i) Next j x(i) = x0(i) - x(i) / a(i, i) Next i For i = 1 To n If Abs(x0(i) - x(i) / x(i)) >= e Then k=1 End If Next i For i = 1 To n x0(i) = x(i) Next i Loop Until k = 0 For i = 1 To n Worksheets(1).Cells(n + 2, i).Value = x(i) Next i End Sub Вывод: написаны программы, которые позволяют решать нелинейные уравнения. Решая F = x + log(x+0.5)-0.5 мы получаем один и тот же ответ. Лабораторная работа №6 Численное интегрирование Формула трапеций В этом случае подынтегральную функцию аппроксимируем интерполяционным многочленом Лагранжа первой степени. Применяя формулу: n 1(1) n1 q n1 Hi dq, i 0,..., n n i !(n 1) ! 0 q i При n = 1, имеем: 1 1 q(q 1) 1 1 H 0 dq , H 1 q dq q 2 2 0 0 x1 Отсюда: h f ( x)dx 2 ( f ( x ) f ( x )) 0 1 x0 Мы получили известную формулу трапеции для приближённого вычисления определённого интеграла. Поскольку отрезок интегрирования [a, b] может быть достаточно большим, то для b вычисления интеграла f ( x) dx разделили промежуток интегрирования на n равных a частей x0 , x1 ; x1 , x2 ;....; xn1 , xn и к каждой из них применим формулу трапеций. Полагая ba и обозначив через f i f ( xi ), i 0,1,..., n значения подынтегральной функции в h n b h h h h точках xi , будем иметь f ( x)dx ( f 0 f1 ) ( f1 f 2 ) ... ( f n1 f n ) [ f 0 2 2 2 2 a 2 f1 ...,2 f n1 f n ] Графический метод трапеции Остаточный член (погрешность) формулы трапеций в предположении, что f n (x) непрерывна на отрезке [a, b], определяется формулой: h 2 (b a) M 2 ; M 2 max f n ( x) ; 12 x [ a, b] Таким образом, погрешность метода трапеций R ~ O(h 2 ) R Формула Симпсона В этом методе предлагается подынтегральную функцию аппроксимировать интерполяционным полиномом Лагранжа второй степени. По формуле: n 1(1) n1 q n1 Hi dq, i 0,..., n при n = 2 получаем: n i !(n 1) ! 0 q i 2 H0 1 1 (q 1)( q 2) dq ; 40 6 2 1 2 H 1 q(q 2) dq 20 3 Так как x2 x0 2h, имеем: 2 H2 1 1 q (q 2) dq 40 6 x2 h f ( x) dx 3 ( f x 4 f ( x ) f ( x )) - формула Симпсона. 0 1 2 x0 b Для вычисления f ( x) dx разобьём промежуток интегрирования [a, b] на 2n равных a частей. Применяя формулу Симпсона к каждой части и обозначая: f i f ( xi ), i 0,1, ..., 2n получим: h h h h ( f 0 4 f1 2 f 2 ) ( f 2 4 f 3 2 f 4 ) ... ( f 2 n2 4 f 2 n1 2 f 2 n ) [( f 0 f 2 n ) 3 3 3 3 a 2( f 2 f 4 ... f 2 n2 ) 4( f1 f 3 f 5 ... f 2 n1 )] b f ( x) dx Графическое представление метода Симпсона Погрешность формулы представленной выше оценивается следующим выражением: h 4 (b a ) R M 4; 2880 M 4 sup f IV ( x ) x [ a, b] Таким образом, погрешность формулы Симпсона пропорциональна O ( h 4 ). Следует отметить, что в формуле Симпсона отрезок интегрирования обязательно разбивается на чётное число интервалов. Метод Ромберга Можно вычислить приближение Симпсона по особым линейным комбинациям формул трапеций. Пусть промежуток интегрирования разбит на 2 k равных частей и для этого разбиения по формуле трапеций получено значение T0( k ) совпадает со значением вычисленного интеграла, если интегрируемая функция f (x) – линейна. 4 m Tm( k11) Tm( k1) (k ) По формуле Tm - называемой формулой Ромберга, построим 4m 1 следующую Т-схему: T0(0) T1(0) T2(0) T0(1) T3(0) T1(1) T4(0) T2 Для интегрируемых функций все столбцы и все наклонные строки Т-схемы сходятся к искомому значению интеграла. Выпишем явные формулы для следующего фрагмента Т-схемы: (1) T0(2) T3(1) T1 (2) T2(2) T0 (3) T1(3) T0(4) Для интегрируемых функций все столбцы и все наклонные строки Т-схемы сходятся к искомому значению интеграла. Выпишем явные формулы для следующего фрагмента Тсхемы: T0(0) T1(0) (1) T0 T3(0) T2(1) (2) T0 ba [ f ( x0 ) f ( x0 )] 1) T0( 0 ) 2 ba 2) T0(1) [ f ( x0 ) 2 f ( x 2 ) f ( x 4 )] 4 ba [ f ( x0 ) 4 f ( x 2 ) f ( x 4 )] 3) T1( 0 ) 6 ba [ f 0 4 f1 2 f 2 4 f 3 f 4 ] 4) T0( 2 ) 12 4T ( 01) T2(01) b a 5) T1(1) 21 1 [7 f 0 32 f1 12 f 2 32 f 3 7 f 4 ] 90 4 1 Квадратурные формулы Гаусса. Задача основана на использовании интерполяционных полиномов Лежандра. Общая формула Гаусса для вычисления определённого интеграла имеет вид: b a n f ( x)dx ((b a) Ai f ( xi )) , где xi a (b a) X i , i 1, 2, ..., n i 1 После разбиения отрезка интегрирования на k равных частей и применив к каждой части формулу Гаусса для фиксированного n, получим: b k xj k n ba - шаг интегрирования f ( x ) dx f ( x ) dx h Ai f ( xi( j ) ) , где h a k j 1 xj 1 j 1 i 1 x i( j ) - i-ая абсцисса, j-го шага интегрирования x0 a, x j x j 1 h, j 1, ..., k , xi( j ) x j 1 xi h, i 1,..., n; xi , Ai -абсциссы и коэффициенты формулы Гаусса. Процедура автоматического выбора шага интегрирования основана на двукратном h вычислении интеграла на каждом шаге: вначале с шагом h, а затем с шагом . 2 Полученные результаты сравниваются и если S S1 S 2 меньше наперёд заданной допустимой ошибки, то считается, что интегрирование на данном шаге выполнено правильно. В противном случае шаг делится пополам и процедура повторяется. Формула прямоугольников Самой простой квадратурной формулой Гаусса является формула при n = 1: x1 0.5; A1 1.0 , которая называется формулой прямоугольников. b Согласно этой формуле: k f ( x)dx h f ( x j ) , то есть интеграл равен площади j 1 a прямоугольника высота которого совпадает со значением подынтегральной функции на середине отрезка интегрирования. Если отрезок интегрирования большой, он разбит на k равных частей, то общая формула прямоугольников имеет вид: b k f ( x)dx h f ( x j ) j 1 a Метод средних прямоугольников. b Погрешность формулы k f ( x)dx h f ( x j ) определяется выражением: j 1 a R h (b a) M 2 ; M 2 max f n ( x) ; 2U x [ a, b] 2 b Таким образом формулы a Интеграл 1 2 3 4 5 6 7 8 9 10 11 12 k f ( x)dx h f ( x j ) пропорциональна O(h 2 ) Метод прямоугольника 0.245611 0.269533 2.387544 1.174173 5.25 5.25 6.38678 0.56874 0.2128 0.749951 1.24678 4.60544 j 1 Метод трапеции Метод Симпсона 0.38829 0.10892 1.886687 1.14567 8.74028 8.74028 2.76885 0.53909 0.1753 0.751599 1.23108 4.58307 0.70857 0.09732 3.510526 1.14631 8.74998 8.74998 7.07821 0.23058 0.20243 0.840128 1.23246 4.55413 Количество разбиений 40 400 4000 Номер задания 1 2 3 4 5 6 7 8 9 10 11 12 Метод прямоугольников 0.00926 0.0093 9.3E-05 Метод трапеции Метод Симпсона 0.38373 0.40067 0.40265 0.40933 0.40295 0.40295 Корень 0.70857 0.09732 3.510526 1.14631 8.74998 8.74998 7.07821 0.23058 0.20243 0.840128 1.23246 4.55413 Программный код метода Гаусса и Зейделя: Sub Гаусс() Dim m As Integer 'кол-во ур-й СЛАУ или кол-во строк Dim n As Integer 'кол-во столбцов в матрице коэффициентов Dim a(100, 101) As Single 'матрица коэффициентов Dim c(1 To 100) As Single 'матрица для хранения результатов Dim i As Integer 'счетчик цикла Dim l As Integer 'счетчик цикла Dim z As Integer 'счетчик Dim j As Integer 'счетчик цикла Dim d As Integer 'счетчик Dim f As Single 'переменная для хранения эл-ов массива Dim b As Single 'переменная для хранения эл-ов массива Dim x As Single 'вспомогательная переменная Dim p As Integer 'счетчик цикла x=0 Worksheets(1).Cells(1, 1).Value = "Метод Гаусса" 'выводим пояснения на лист1 Worksheets(1).Cells(2, 1).Value = "Коэффициенты системы" Stop 'останов исп-ся для того, чтобы задать коэффициенты системы m = CInt(InputBox("Введите кол-во ур-й СЛАУ")) 'переменной m присваиваем кол-во ур-й СЛАУ n = m + 1 'коэффициентов будет на 1 больше, чем уравнений СЛАУ Worksheets(1).Cells(m + 3, 1).Value = "Результат:" 'выводим пояснение на лист1 For i = 1 To m 'с листа считываем коэффициенты в массив коэффициентов For j = 1 To n a(i, j) = Worksheets(1).Cells(i + 2, j).Value Next j Next i z=0 d=0 1 For i = 1 To (m - z) 'Методом исключения Гаусса преобразуем матрицу коэффициентов СЛАУ b = a(i + z, z + 1) For j = 1 To (n - z) If (d = 0) Then f = a(i + z, j + z) For l = (1 + z) To n a(i + z, l) = a(i + z, l) / f Next l d=d+1 If z = (m - 1) Then GoTo 3 GoTo 4 Else: a(i + z, j + z) = a(i + z, j + z) - a(z + 1, j + z) * b End If Next j 4 Next i z=z+1 d=d-1 GoTo 1 3 For i = m To 1 Step -1 'выведем преобразованную матрицу коэффициентов СЛАУ на лист2 For j = n To 1 Step -1 Worksheets(2).Cells(i, j).Value = a(i, j) Next j Next i c(m) = a(m, n) 'запоминаем найденную переменную в матрицу резудьтата For i = (m - 1) To 1 Step -1 'ищем значения остальных переменных x = a(i, n) For j = (n - 1) To (i + 1) Step -1 x = x - a(i, j) * c(j) Next j 5 c(i) = x 'заносим найденное значение в матрицу результата Next i For i = 1 To m 'выводим корни СЛАУ на лист1 Worksheets(1).Cells(m + 4, i).Value = c(i) Next i End Sub Sub Зейдель() Dim n As Integer 'порядок матрицы системы Dim a(100, 100) As Double 'преобразованная матрица Dim x(100) As Double 'матрица для хранения результатов Dim b(100) As Double 'столбец свободных членов Dim e As Double 'погрешность Dim i As Integer 'счетчик цикла Dim j As Integer 'счетчик цикла Dim c As Boolean 'Переменная для принятия возвращаемого функцией значения n = CInt(InputBox("Введите порядок матрицы системы")) 'переменной m присваиваем порядок матрицы системы Worksheets(2).Cells(1, 1).Value = "Метод Зейделя" 'выводим пояснения на лист1 Worksheets(2).Cells(2, 1).Value = "Преобразованная матрица" Worksheets(2).Cells(2, n + 2).Value = "Столбец свободных членов" Worksheets(2).Cells(2, n + 6).Value = "Столбец начальных приближений" Worksheets(2).Cells(n + 3, 1).Value = "Результат" Worksheets(2).Cells(n + 3, 3).Value = "Счетчик числа итераций" Stop 'останов исп-ся для того, чтобы задать коэффициенты системы e = CDbl(InputBox("Введите погрешность")) For i = 1 To n 'с листа считываем элементы в матрицу a For j = 1 To n a(i, j) = Worksheets(2).Cells(i + 2, j).Value Next j Next i For j = 1 To n 'с листа считываем элементы в матрицу b b(j) = Worksheets(2).Cells(j + 2, n + 2).Value Next j For j = 1 To n 'с листа считываем элементы(начальные приближения) в матрицу x x(j) = Worksheets(2).Cells(j + 2, n + 6).Value Next j c = Zeidel(n, a(), b(), x(), e) 'Вызываем ф-ю Zeidel и возвращаемое значение присваиваем переменной с If (c = False) Then MsgBox ("Условие сходимости не выполняется"): GoTo 1 'Если ф-я вернула False For j = 1 To n 'Выводим решение на лист1 Worksheets(2).Cells(n + 3 + j, 1).Value = x(j) Next j 1 End Sub Function Zeidel(n As Integer, a() As Double, b() As Double, x() As Double, e As Double) As Boolean Dim i As Integer, j As Integer 'Счетчики цикла Dim s As Double 'Переменная для суммирования элементов уравнения всех, кроме диагонального Dim m As Double 'Переменная для хранения модуля разности между ближайшими приближениями Dim s1 As Double Dim p As Integer ' счетчик числа итерации Dim v As Double 'Переменная для хранения предыдущего приближения p=0 For i = 1 To n 'Проверяем выполняется ли условие сходимости s=0 For j = 1 To n If j <> i Then s = s + Abs(a(i, j)) 'Если элемент не диагональный Next j If s >= Abs(a(i, i)) Then Zeidel = False: GoTo 2 'Если условие сходимости не выполняется Next i Do m=0 For i = 1 To n 'Просматриваем строки матрицы коэффициентов s1 = 0 For j = 1 To n 'Просматриваем столбцы матрицы коэффициентов s1 = s1 + a(i, j) * x(j) Next j v = x(i) 'Запоминаем приближение x(i) = x(i) - (1 / a(i, i)) * (s1 - b(i)) 'Высчитываем следующее приближение If (Abs(v - x(i)) > m) Then m = Abs(v - x(i)) 'Запоминаем модуль разности ' соседних приближений для сравнения его затем с заданной точностью Next i p = p + 1 'увеличиваем счетчик Loop While m >= e 'Продолжаем вычисления пока не достигнута точность Zeidel = True Worksheets(2).Cells(n + 4, 3).Value = p 'Выводим значение счетчика на лист 2 End Function Начало m = CInt (InputBox (“Введите количесвто уравнений СЛАУ”)) i=1 j=1 i<=m z=0 d=0 j<=n i=i+1 Ai j = WorkSheets (1). Cells (i + 2, j). V i=1 j=j+1 i<=m b = A (i + z, z + 1 ) z=z+1 d=d-1 i=1 j=j+1 j<=n d=0 A (i + z, j + z) = A (i + z, j + z) – f (z + 1, j + z) + l j=j+1 j = A (i + z, j + z) i=1+z j<=n z=m-1 d=d+1 A (i + z, l) = A (i + z, l) jl = l + 1 I = m; step - 1 i<=1 J = n; step - 1 c (m) = A (m, n) c = (m - 1); step - 1 j<=1 i=i+1 i > = (i +1) WorkSheets (1). Cells (i, j) = A (i i=1 x = A (i, n) j=j+1 i<=m J = (n -1); step - 1 End Sub i > = (i +1) Конец A (i, j) = 1 x = x – A (i, j) * j j=j+1 WorkSheets (1). Cells (m + 4, i). Value = с (i) I=I+1 c (i) = x i=i+1 Вывод: написаны программы, которые производят вычисления интегралов методами: Симпсона, Ромберга, треугольников, трапеции. Лабораторная работа №7 Решение дифференциальных уравнений Цель работы: 1) Ознакомление с широкоприменяющимися на практике численными методами решения задачи Коши для обыкновенных дифференциальных уравнений 1 порядка. 2) Приобретение практических навыков расчёта указанных задач методами Рунге – Кутта различных порядков: методом Эйлера, методом усреднённых тангенсов, методом исправленных ломаных, классическим методом Рунге – Кутта 4 порядка. Численные методы решения задачи Коши Будем рассматривать вычислительные методы решения задач с начальным условием (задач Коши) на случае одного дифференциального уравнения 1 порядка, разрешённого относительно производной, то есть уравнения вида: y' = f (x, y) удовлетворяющего при x = x 0 начальному условию Y ( x 0 ) = Y0 . Условия существования и единственности решения поставленной задачи Коши будем считать выполненными на всём отрезке поиска решения x0 x xn . Будем также предполагать, что функция f (x, y) на это отрезке обладает необходимой в ходе дальнейших рассуждений, гладкостью. Рассмотрим в данной работе методы, которые относятся к так называемым одношаговым функциям. Наиболее естественными методами в решении уравнения y' = f (x, y)с позиций классического математического анализа является приближённый поиск с помощью ряда Тейлора. Метод Рунге – Кутта IV порядка Является наиболее распространённым методом решения систем при шаге h = const Достоинства: 1. Высокая точность 2. Погрешность h 5 3. Меньшая склонность к возникновению неустойчивости решения. dy F1 ( x, y1 ,..., y i ,..., y n ) dx ... dy Fi ( x, y1 ,..., y i ,..., y n ) dx ... dyn Fn ( x, y1 ,..., yi ,..., yn ) dx f2: F (b) Алгоритм реализации метода Рунге – Кутта заключается в циклических вычислениях y j (i 1) на каждом i + 1 шаге по следующим формулам: K1 j hF j ( xi , y ji ); h 1 K 2 j hF j ( xi , y ji K1 j ) Для решения дифференциальных уравнений: 2 2 y' = - y / r = - y при r = 1, h = 0.1, x 0 = 0 и y 0 1 h 1 K 3 j hF j ( xi , y ji K 2 j ) 2 2 K 4 j hF j ( xi h, y ji K 3 j ) 1 y j (i 1) y ji ( K 1 j 2 K 3 j K 4 j 6 При переходе от одной формулы к другой задаются или вычисляются соответствующие значения x и yi и находятся по программе значений функции Fi ( xi , yi ) . Решение дифференциального уравнения производится по приведённым формулам. 0.1 0.9048375 0.2 0.818730901 0.3 0.74081842 0.4 0.67032028 0.5 0.6065309344 Метод Эйлера – Коши Этот метод – простейший метод 1 порядка для численного интегрирования дифференциальных уравнений. Он реализуется следующей рекуррентной формулой: y i (i 1) y ji hF j ( xi , y i ) , где h – шаг интегрирования (приращение переменной x). Данный метод обладает большой погрешностью и имеет систематическое накопление ошибок. Погрешность метода R ~ (h 2 ) . I x y 0 1.000 2.000 1 1.0500 2.2426 2 1.1000 2.5229 3 1.1500 2.8449 4 1.2000 3.6333 5 1.2500 4.1108 Вывод: написаны программы, которые позволяют производить вычислительные действия дифференциальных уравнений методами: Эйлера-Коши для решения уравнений 1 порядка и Рунге-Кутта для решения уравнений IV порядка.