Реферат по имитационному моделированию на тему Эффективные алгоритмы численного решения алгебраических уравнений, расчета производных, решение систем линейных алгебраических и дифференциальных уравнений в Scilab.
ФБГОУВПО «Мордовский Государственный педагогический институт им. М.Е.Евсевьева»
Физико-математический факультет
Кафедра информатики и вычислительной техники
РЕФЕРАТ
Эффективные алгоритмы численного решения
алгебраических уравнений, расчета производных, решение
систем линейных алгебраических и дифференциальных
уравнений в Scilab.
Выполнил: студент группы МДМ-115
физико-математического факультета
Ерина Оксана
Проверила: Кормилицына Т.В.
Саранск 2017
Введение
Scilab (/ˈsaɪlæb/) — пакет прикладных математических программ, предоставляющий открытое окружение для инженерных (технических) и научных расчётов. Это самая полная общедоступная альтернатива MATLAB.
С 1994 года распространяется вместе с исходным кодом через Интернет. В 2003 году для поддержки Scilab был создан консорциум HYPERLINK "https://ru.wikipedia.org/w/index.php?title=Scilab_Consortium&action=edit&redlink=1" \o "Scilab Consortium (страница отсутствует)" Scilab Consortium. Сейчас в него входят 25 участников, в том числе HYPERLINK "https://ru.wikipedia.org/wiki/Mandriva" \o "Mandriva" Mandriva, INRIA и ENPC (Франция).
Scilab содержит сотни математических функций, и есть возможность добавления новых, написанных на различных языках (C, C++, Fortran и т. д.). Также имеются разнообразные структуры данных (списки, полиномы, рациональные функции, линейные системы), интерпретатор и язык высокого уровня.
Scilab был спроектирован как открытая система, и пользователи могут добавлять в него свои типы данных и операции путём перегрузки.
В системе доступно множество инструментов:
2D и 3D графики, анимация
Линейная алгебра, разреженные матрицы (sparse matrices)
Полиномиальные и рациональные функции
Интерполяция, аппроксимация
Симуляция: решение ОДУ и ДУ
Scicos: гибрид системы моделирования динамических систем и симуляции
Дифференциальные и не дифференциальные оптимизации
Обработка сигналов
Параллельная работа
Статистика
Работа с компьютерной алгебройИнтерфейс к Fortran, HYPERLINK "https://ru.wikipedia.org/wiki/Tcl" \o "Tcl" Tcl/ HYPERLINK "https://ru.wikipedia.org/wiki/Tk" \o "Tk" Tk, C, C++, Java, LabVIEW Scilab имеет схожий с MATLAB язык программирования. В состав пакета входит утилита, позволяющая конвертировать документы Matlab в Scilab.
Scilab позволяет работать с элементарными и большим числом специальных функций (Бесселя, Неймана, интегральные функции), имеет мощные средства работы с матрицами, полиномами (в том числе и символьно), производить численные вычисления (например, численное интегрирование) и решение задач линейной алгебры, оптимизации и симуляции, мощные статистические функции, а также средство для построения и работы с графиками.
Для численных расчётов используются библиотеки HYPERLINK "https://ru.wikipedia.org/wiki/Lapack" \o "Lapack" Lapack, LINPACK, ODEPACK , HYPERLINK "https://ru.wikipedia.org/wiki/Automatically_Tuned_Linear_Algebra_Software" \o "Automatically Tuned Linear Algebra Software" Atlas и другие.
В состав пакета также входит Scicos — инструмент для редактирования блочных диаграмм и симуляции (аналог simulink в пакете MATLAB). Имеется возможность совместной работы Scilab с программой HYPERLINK "https://ru.wikipedia.org/wiki/LabVIEW" \o "LabVIEW" LabVIEW.
Программа доступна для различных операционных систем, включая HYPERLINK "https://ru.wikipedia.org/wiki/Linux" \o "Linux" Linux, HYPERLINK "https://ru.wikipedia.org/wiki/Microsoft_Windows" \o "Microsoft Windows" Microsoft Windows и HYPERLINK "https://ru.wikipedia.org/wiki/OS_X" \o "OS X" Mac OS X. Возможности Scilab могут быть расширены внешними программами и модулями, написанными на разных языках программирования. Программа имеет открытый исходный код, что позволяет как свободное коммерческое использование и распространение неизменённых версий, так и некоммерческое распространение измененных версий, которые должны включать в себя исходный код. Для коммерческого распространения измёненных версий необходимо согласование с INRIA.
Начиная с версии 5.0 программа распространяется под совместимой с GNU GPL 2 лицензией HYPERLINK "https://ru.wikipedia.org/wiki/CeCILL" \o "CeCILL" CeCILL.
Отличия от некоторых коммерческих программ:
Бесплатность.
Свободность (с версии 5.0).
Маленький размер — дистрибутив 4 версии занимал менее 20 МБ против более чем двухгигабайтного пакета MATLAB. Инсталлятор 5 версии (5.4.1) увеличился в объёме до 117 МБ.
Возможность запуска в консоли без использования графического интерфейса, в том числе в версии под Windows (в UNIX и Windows версиях MatLab-а эта возможность присутствует тоже). Это позволяет производить автоматизированные вычисления, есть пакетный режим.
1 . Решение алгебраических уравнений.
Любое уравнение P(x) = 0, где P(x) — это многочлен, отличный от нулевого, называется алгебраическим уравнением или полиномом. Всякое алгебраическое уравнение относительно x можно записать в виде a0x n+a1x n−1+· · ·+an−1x+an = 0, где a0 6= 0, n > 1 и ai — коэффициенты алгебраического уравнения n–й степени. Например, линейное уравнение это алгебраическое уравнение первой степени, квадратное — второй, кубическое — третьей и так далее. Решение алгебраического уравнения в Scilab состоит из двух этапов. Необхо- димо задать полином P(x) с помощью функции poly, а затем найти его корни, применив функцию roots. Итак, определение полиномов в Scilab осуществляет функция poly(a, "x ["fl"]),
Любое уравнение P(x) = 0, где P(x) — это многочлен, отличный от нулевого, называется алгебраическим уравнением или полиномом. Всякое алгебраическое уравнение относительно x можно записать в виде a0x n+a1x n−1+· · ·+an−1x+an = 0, где a0 6= 0, n > 1 и ai — коэффициенты алгебраического уравнения n–й степени. Например, линейное уравнение это алгебраическое уравнение первой степени, квадратное — второй, кубическое — третьей и так далее. Решение алгебраического уравнения в Scilab состоит из двух этапов. Необхо- димо задать полином P(x) с помощью функции poly, а затем найти его корни, применив функцию roots. Итак, определение полиномов в Scilab осуществляет функция
параметра a воспринимаются функцией как корни, для которых необходимо рас- считать коэффициенты соответствующего полинома. По умолчанию fl=r. Следующий пример отражает создание полинома p, имеющего в качестве корня тройку, и полинома f с коэффициентом 3.
-->p=poly(3,’x’,’r’);
-->f=poly(3,’x’,’c’);
-->p p = - 3 + x
-->f
f = 3
Далее приведены примеры создания более сложных полиномов.
-->//Полином с корнями 1, 0 и 2
-->poly([1 0 2],’x’)
ans = 2 3 2x - 3x + x
-->//Полином с коэффициентами 1, 0 и 2
-->poly([1 0 2],’x’,’c’)
ans = 2 1 + 2x
Функция roots(p)
предназначена для решения алгебраического уравнения. Здесь p — это полином, созданный функцией poly и представляющий собой левую часть уравнения P(x) = 0.
Решим несколько алгебраических уравнений.
Найти корни полинома 2x 4 − 8x 3 + 8x 2 − 1 = 0.
Для решения этой задачи необходимо задать полином p. Сделаем это при по- мощи функции poly, предварительно определив вектор коэффициентов V . Обра- тите внимание, что в уравнении отсутствует переменная x в первой степени, это означает, что соответствующий коэффициент равен нулю:
-->V=[-1 0 8 -8 2];
-->p=poly(V,’x’,’c’)
p = 2 3 4 1 + 8x - 8x + 2x
Теперь найдем корни полинома:
-->X=roots(p)
X = ! 0.4588039 !
! - 0.3065630 !
! 1.5411961 !
! 2.306563 !
2. Вычисление производной функции в точке. Приближенное вычисление частных производных.
Универсальной командой дифференцирования является команда
g=numdiff(fun,x)
здесь fun — имя функции, задающей выражение для дифференцирования. Функция должна быть задана в виде y=fun(x [, p1, p2,..., pn]),
где x — переменная, по которой будет проводится дифференцирование. Если параметры p1, p2, . . . , pn присутствуют в описании функции, то они должны быть обязательно определены при вызове, например, так:
g=numdiff(list(fun,p1,p2,...pn),x).
Результат работы функции — матрица gij = dfi /dxj .
Рассмотрим несколько примеров.
Вычислить f ′ (1), если f(x) = (x + 2)3 + 5x
-->function f=my(x), f=(x+2)^3+5*x, endfunction;
-->numdiff(my,1)
ans = 32.
-->x=1;3*(x+2)^2+5
ans = 32.
Задана функция многих переменных y(x1,x2,x3) = x1x x3 2 +x 2 1x3. Вычислить dy/dx1 , dy/dx2 , dy/dx3 в точке (1, 2, 3).
-->function [Y]=f(X), Y=X(1)*X(2)^X(3)+X(1)^2*X(3),endfunction
-->X=[1 2 3]; -->numdiff(f,X)
ans = 14. 12. 6.5451775
-->//--------------------------------
-->function [Y]=f1(X),
Y(1)=X(2)^X(3)+2*X(1)*X(3),
Y(2)=X(1)*X(3)*X(2)^(X(3)-1),
Y(3)=x(1)*X(2)^X(3)*log(X(2))+X(1)^2, endfunction –
->f1(X) ans = 14.
12.
6.5451774
3. Решение систем линейных алгебраических уравнений.
Система m уравнений с n неизвестными вида:
a11x1 + a12x2 + · · · + a1nxn = b1 ,a21x1 + a22x2 + · · · + a2nxn = b2,
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
am1x1 + am2x2 + · · · + amnxn = bmназывается системой линейных алгебраических уравнений (СЛАУ), причем xj — неизвестные, aij — коэффициенты при неизвестных, bi — свободные коэффициенты (i = 1 ... m, j = 1 ... n). Система из m линейных уравнений с n неизвестными может быть описана при помощи матриц:
A · x = b, где x — вектор неизвестных, A — матрица коэффициентов при неизвестных или матрица системы, b — вектор свободных членов системы или вектор правых частей. Совокупность всех решений системы (x1,x2,... ,xn) называется множеством решений или просто решением системы.
Решить СЛАУ при помощи правила Крамера:
2x1 + x2 − 5x3 + x4 = 8 ,x1 − 3x2 − 6x4 = 9 ,2x2 − x3 + 2x4 = −5 ,x1 + 4x2 − 7x3 + 6x4 = 0 .
Правило Крамера заключается в следующем. Если определитель ∆ = det A матрицы системы из n уравнений с n неизвестными A · x = b отличен от нуля, то система имеет единственное решение x1,x2,... ,xn, определяемое по формулам Крамера: xi = ∆i/∆, где ∆i — определитель матрицы, полученной из матрицы системы A заменой i-го столбца столбцом свободных членов b. Текст файла- сценария с решением задачи по формулам Крамера: 54
//Матрица коэффициентов:
A=[2 1 -5 1;1 -3 0 -6;0 2 -1 2;1 4 -7 6];
b=[8;9;-5;0]; //Вектор свободных коэффициентов
A1=A;A1(:,1)=b; //Первая вспомогательная матрица
A2=A;A2(:,2)=b; //Вторая вспомогательная матрица
A3=A;A3(:,3)=b; //Третья вспомогательная матрица
A4=A;A4(:,4)=b; //Четвертая вспомогательная матрица
D=det(A); //Главный определитель
//Определители вспомогательных матриц:
d(1)=det(A1);
d(2)=det(A2);
d(3)=det(A3);
d(4)=det(A4);
x=d/D //Вектор неизвестных
P=A*x-b //Проверка
Решим систему из двух уравнений вида A*x=b
Задаем матрицу коэффициентов:
-->A=[1,2;3,4]
A =
1. 2.
3. 4.
Задаем вектор свободных коэффициентов:
-->b=[2;1]
b = 2.
1.
Определяем детерминант матрицы:
-->det(A)
ans = - 2
Так как определитель матрицы отличен от нуля, решение СЛАУ существует.
Решение СЛАУ методом обратной матрицы
-->x=A\b
x = - 3.
2.5
Запись A\b соответствует математической операции A-1b. Записи x=A\b эквивалентна запись x=inv(A)*b
Эту систему уравнений также можно решить с помощью специальной функции linsolve (эта функция решает уравнение вида Ax+b=0, поэтому поменяем знак вектора b)
x=linsolve(A,-b)
x =
- 3.
2.5
и получили ответ: x0= -3; x1= 2.5;
Проверяем
A*x-b
ans =
1.0D-14 *
0.2220446
0.3552714
результирующий вектор близок к нулю, то есть система решена верно.
4. Решение обыкновенных дифференциальных уравнений
Дифференциальным уравнением n-го порядка называется соотношение вида
H(t,x,x′ ,x′′,...,x(n) ) = 0
Решением дифференциального уравнения является функция x(t), которая обращает уравнение в тождество. Системой дифференциальных уравнений n-го порядка называется система вида:
x ′ 1 = f1(t,x1,x2,... ,xn)
x ′ 2 = f2(t,x1,x2,... ,xn)
· · ·
x ′ n = fn(t,x1,x2,... ,xn)
Решение системы — вектор, который обращает уравнения системы в тождества:
x(t) =
x1(t)
x2(t)
. . .
xn(t)
Дифференциальные уравнения и системы имеют бесконечное множество ре шений, которые отличаются друг от друга константами. Для однозначного определения решения требуется задать дополнительные начальные или граничные условия. Количество таких условий должно совпадать с порядком дифференциального уравнения или системы. В зависимости от вида дополнительных условий в дифференциальных уравнениях различают: задачу Коши — все дополнительные условия заданы в одной (чаще начальной) точке интервала; краевую зада- чу — дополнительные условия указаны на границах интервала. Большое количество уравнений может быть решено точно. Однако есть уравнения, а особенно системы уравнений, для которых точное решение записать нельзя. Такие уравнения и системы решают при помощи численных методов. Численные методы также применяют в том случае, если для уравнений с из- вестным аналитическим решением требуется найти числовое значение при опре- деленных исходных данных. Для решения дифференциальных уравнений и систем в Scilab предусмотрена функция [y,w,iw]=ode([type],y0,t0,t [,rtol [,atol]],f [,jac] [,w,iw])
для которой обязательными входными параметрами являются: y0 — вектор на- чальных условий; t0 — начальная точка интервала интегрирования; t — коорди- наты узлов сетки, в которых происходит поиск решения; f — внешняя функция, определяющая правую часть уравнения или системы уравнений (8.2); y — вектор решений . Таким образом, для того чтобы решить обыкновенное дифференциаль- ное уравнение вида dy/dt = f(t,y), y(t0) = y0, необходимо вызвать функцию y=ode(y0,t0,t,f). Рассмотрим необязательные параметры функции ode: type — параметр, с помощью которого можно выбрать метод решения или тип решаемой задачи, указав одну из строк: adams — применяют при решении дифференциальных уравнений или систем методом прогноза-коррекции Адамса; stiff — указывают при решении жестких задач; rk — используют при решении дифференциальных уравнений или систем методом Рунге — Кутта четвертого порядка; rkf — указывают при выборе пятиэтапного метода Рунге — Кутта четвертого порядка; fix — тот же метод Рунге — Кутта, но с фиксированным шагом; rtol, atol — относительная и абсолютная погрешности вычислений, вектор, раз- мерность которого совпадает с размерностью вектора y, по умолчанию rtol=0.00001, atol=0.0000001, при использовании параметров rkf и fix - rtol=0.001, atol=0.0001; jac — матрица, представляющая собой якобиан правой части жесткой системы дифференциальных уравнений, задают матрицу в виде внешней функции вида J=jak(t,y); w, iw — векторы, предназначенные для сохранения информации о параметрах интегрирования, которые применяют для того, чтобы последующие вычис- ления выполнялись с теми же параметрами.
Решить задачу Коши x ′ = cos(xy), y ′ = sin(x + ty), x(0) = 0, y(0) = 0. на интервале [0; 10].
//Функция, описывающая систему дифференциальных уравнений
Function dy=syst(t,y)
dy=zeros(2,1);
dy(1)=cos(y(1)*y(2));
dy(2)=sin(y(1)+y(2)*t);
endfunction
//Решение системы дифференциальных уравнений x0=[0;0];t0=0;t=0:*0.1*:10;y=ode(x0,t0,t,syst);
//Формирование графического решения
plot(t,y)
Заключение
На основе анализа теории и примеров можно сделать вывод, что Scilab становится не просто «вычислялкой» отдельных небольших примеров, а настоящей «средой программирования с математическим уклоном», позволяющей создавать свои собственные математические «типы данных» — числовые системы, функционалы — и полноценные программные модули, которые могут использовать весь встроенный (или также собственноручно достроенный) функционал Scilab.
Scilab — мощный открытый пакет прикладных математических программ (система компьютерной математики) для инженерных и научных расчётов.
Система позволяет
решать задачи линейной алгебры;
решать нелинейные уравнения и системы;
решать задачи оптимизации;
дифференцировать и интегрировать;
решать обыкновенные дифференциальные уравнения и системы.
обрабатывать экспериментальные данные (интерполяция и аппроксимация, метод наименьших квадратов);
создавать различные виды графиков и поверхностей.
Список используемой литературы
1. Ярушкина Н.Г., Ястребова Н.Н., Чекина А.В. Нечеткие интеллектуальные системы в среде SciLab
2. М.И.Павлова. Руководство по работе с пакетом SCILAB
3.Е.Р.Алексеев, О.В.Чеснокова. Scilab - теория и практика на русском языке
4.Е.Р.Алексеев, О.В. Чеснокова, Е.А. Рудченко. Scilab. Решение инженерных и математических задач. М., ALT Linux, Бином, 2008.
5.Константин Носов. Scilab: серьезная математика, доступная всем.
6.И.С. Тропин, О.И. Михайлова, А.В. Михайлов. Численные и технические расчеты в среде Scilab. (ПО для решения задач численных и технических вычислений). М., 2008.