Visual Basic_учебник (1108585), страница 9
Текст из файла (страница 9)
МассивыОдномерные массивы. Аппроксимацияэкспериментальных данных прямой линиейВ практике научных вычислений порой приходится иметь дело не с десятками, и даже не с сотнями – с миллионами различных значений.Естественно, описывать отдельную переменную для каждого такогозначения не рационально. На этот случай в языках программированияпредусмотрены чуть более сложные структуры данных – массивы.Массив переменных представляет собой совокупность множества переменных одного и того же типа. Обозначается весь массив одним общим именем.
Отдельные переменные отличаются друг от друга индексами.a) Dim var As IntegerИндексы:(0)(1)(2)(3)б) Dim arr(3) As IntegerРис. 8 Простая переменная (а) и одномерный массив переменных (б)Так же, как и обычная переменная, массив должен быть описан предложением Dim. Отличие лишь в том, что сразу после имени в круглыхскобках указывают максимальное значение индекса, то есть число составляющих его элементов минус один1 (см. рисунок 8).1т.к. индексация элементов начинается с нуля.62Использование массивов в программах мы проиллюстрируем на примере конкретной задачи – аппроксимации экспериментальных данныхпрямой линией.
Математическая формулировка этой задачи состоит вследующем.Пусть в результате серии экспериментов получено пар чисел ( , ).Здесь соответствует значению контролируемого параметра, а –результату измерения. Например, если измеряется константа скорости некоторой реакции при различных температурах , то можно положить = 1/, = ln .
Пусть также известно, что, теоретически, и должны быть связаны между собой уравнением прямой линии = + . В нашем примере по значению коэффициента можнооценить энергию активации реакции.Понятно, что реальность всегда отличается от теории и, в частности, изза ошибок эксперимента, три и более точки на одну прямую не уложатся. Можно, тем не менее, сформулировать задачу поиска наилучшего приближения к «истинной» прямой линии путем определениязначений коэффициентов и , при которых экспериментальные точкиминимально отклоняются от «теоретической» функции. В качестве меры одного отклонения можно взять разность , = + − ,а суммарное отклонение всех точек определить как сумму квадратов2отклонений (, ) = =1 . Теперь, когда суммарное отклонениепредставлено в виде функции, зависящей от коэффициентов прямойлинии, осталось найти такие значения и , при которых функция принимает минимальное значение.
Для этого достаточно приравнять нулюее частные производные. Получившаяся система из двух линейныхуравнений с двумя неизвестными приводит к следующему решению:= − − − 263 = − Здесь черта над буквой означает усреднение: =,=.Еслитребуется не только вычислить коэффициенты и , но и сравнить исходные экспериментальные данные с «теоретическими» значениями,следует воспользоваться массивами типа Double для промежуточногохранения исходных данных.Приведенная ниже программа считывает исходные данные из текстового файла, находит коэффициенты оптимальной прямой и выводит вконсольное окно таблицу, в которой экспериментальные данные сравниваются с вычисленными теоретическими значениями1.Option Explicit OnImports System.IOModule Module1Sub Main()'' Часть 1.
Считывание исходных данных'Dim N As IntegerDim reader As StreamReader = _New StreamReader("inputdata.csv")' Первая строка содержит число эксперим. точекN = Integer.Parse(reader.ReadLine())' Теперь известен необходимый размер массивовDim x(N-1) As DoubleDim y(N-1) As DoubleFor i As Integer = 0 To N - 1Dim line As String = reader.ReadLine()Dim semicolon As Integer = line.IndexOf(";")' В качестве индекса массивов будет' использован счетчик цикла' поэтому на разных итерациях данные' будут присвоены разным элементамx(i)=Double.Parse(line.Substring(0,semicolon))y(i)=Double.Parse(line.Substring(semicolon+1))'1Обратите внимание на комментарии в тексте программы, поясняющие ееработу.
Комментарий можно поместить в любую строку программы послесимвола апостроф. Комментарии никак не влияют на исполнение программы.64Next i'' Часть 2. Вычисление коэффициентов a и b'Dim Xmean As Double = 0Dim Ymean As Double = 0For i As Integer = 0 To N - 1Xmean = Xmean + x(i)Ymean = Ymean + y(i)Next iXmean = Xmean / NYmean = Ymean / NDim numerator As Double = 0Dim denominator As Double = 0For i As Integer = 0 To N - 1numerator = numerator + _(x(i) - Xmean) * (y(i) - Ymean)denominator = denominator + (x(i) - Xmean)^2Next iDim A As Double = numerator / denominatorDim B As Double = Ymean - A * Xmean'' Часть 3.
Распечатка результатов'Console.WriteLine( _"Уравнение прямой: Y = {0:F4} * X + {1:F4}", _A, B)Console.WriteLine()Console.WriteLine( _"XiYiA*Xi+BDelta")For i As Integer = 0 To N - 1Console.WriteLine( _"{0,10:F4} {1,10:F4} {2,10:F4} {3,10:F4}", _x(i), y(i), A*x(i)+B, y(i)-A*x(i)-B)Next iConsole.ReadLine()End SubEnd ModuleДвумерные массивы и матрицыОдин из разделов высшей математики, наиболее полезных практически, – матричная алгебра.
Матричную алгебру применяют для решения65систем линейных и дифференциальных уравнений, поиска оптимальных наборов параметров, проектирования трехмерных сцен на плоскость экрана и многого другого. Самые разнообразные математические проблемы сводятся к однотипным операциям и уравнениям матричной алгебры, если различного рода наборы коэффициентов в задаче представить в виде матриц и векторов.Матрица (размером × ) представляет собой прямоугольную таблицу чисел из строк и столбцов.
Матрицу из одного столбца называют вектором. Само число в векторной алгебре называют скаляром.Опишем очень коротко некоторые операции с матрицами. Рассмотримв качестве примера две матрицы11 = 2131122232=112112221323Самая простая операция – умножение на скаляр – выполняется поэлементно11 ∙ ∙ с = 21 ∙ 31 ∙ 12 ∙ 22 ∙ 32 ∙ Транспонирование – поворот вокруг диагонали, то есть превращениестрок в столбцы и наоборот:11т = 1221223132Сложение определено только для матриц с одинаковым числом строки столбцов:т + =11 + 1112 + 2121 + 1222 + 226631 + 1332 + 21Самая нетривиальная операция – произведение матриц.
Каждый элемент произведения двух матриц – сумма произведений элементовстроки первой матрицы и столбца второй матрицы. Количество этихэлементов должно быть одинаково, поэтому произведение определено только в том случае, если число столбцов первой матрицы равночислу строк второй. Например:∙=11 11 + 12 21 + 13 3121 11 + 22 21 + 23 3111 12 + 12 22 + 13 3221 12 + 22 22 + 23 32В общем случае, если ℂ = ∙ , то = =1 ∙ , где – числостолбцов матрицы и число строк матрицы .
Причины, по которымпроизведение определено именно таким образом, рассматриваются вкурсе линейной алгебры. Мы же обратим внимание на реализациюопераций с матрицами при программировании и вернемся к понятиюмассива.Напомним, что массивом называется множество переменных, обозначаемых одним именем и отличающихся индексами. В языке VB у массива может быть более одного индекса – это так называемый многомерный массив. В частности, двумерные массивы удобно использоватьдля представления матриц. При описании двумерного массива указывают максимальные индексы по каждому измерению.Индексы:(0,0)(0,1)(1,0)(1,1)Dim arr(1,1) As IntegerРис. 9 Двумерный массивПриведем пример программы, считывающей двумерную матрицу изфайла.67Option Strict OnImports System.IOModule Module1Sub Main()Dim M As IntegerDim N As IntegerDim reader As StreamReader = _New StreamReader("matrix.csv")' Первая строка файла содержит' число строк и столбцов через ;Dim line As String = reader.ReadLine()Dim semicolon As Integer = line.IndexOf(";")M = Integer.Parse(line.Substring(0, semicolon))N = Integer.Parse(line.Substring(semicolon + 1))' Теперь известен необходимый размер массиваDim matrix(M-1, N-1) As DoubleFor i As Integer = 0 To M - 1' строка файла = строка матрицы,' элементы строки через ;line = reader.ReadLine()For j As Integer = 0 To N - 2semicolon = line.IndexOf(";")matrix(i, j) = Double.Parse _(line.Substring(0, semicolon))line = line.Substring(semicolon + 1)Next jmatrix(i, N - 1) = Double.Parse(line)Next i' Распечатка считанных значенийFor i As Integer = 0 To M - 1For j As Integer = 0 To N - 1Console.Write("{0,10:F4}", matrix(i, j))Next jConsole.WriteLine()Next iConsole.ReadLine()End SubEnd ModuleОбратите внимание на использование вложенных циклов, что являетсятипичным при работе многомерными массивами.