4 Моделирование нелинейных систем
4.1 Найти корни полиномов:
.
Решение: Определение полиномов в Scilab осуществляет функция:
poly(a, "x ["fl"]),
где a – это число или матрица чисел,
x – символьная переменная,
fl – необязательная символьная переменная, определяющая способ задания полинома. Символьная переменная fl может принимать только два значения – «roots» или «coeff» (соответственно «r» или «c»). Если fl=c, то будет сформирован полином с коэффициентами, хранящимися в параметре a. Если же fl=r, то значения.
Функция roots(p) предназначена для решения алгебраического уравнения. Здесь p – это полином, созданный функцией poly и представляющий собой левую часть уравнения P (x) = 0.
Первое уравнение:
-->V= [-5 0 -3 0 2];
-->p = poly (V, ‘x’, ‘c’);
-->p = -5-3x2+2x4;
-->X = roots (p);
X = -1,5811388
= 1,5811388
= -5,551D-17+i
= -5,551D-17-i
Второе уравнение:
-->X = roots(poly[-7,4 5,4 0,52 2], ‘x’, ‘c’);
X = -0,3944527+1,8362718i
= -0,3944527-1,8362718i
= 1,0489053.
4.2
Решить систему уравнений:
Решение:
Если заданы m уравнений с n неизвестными и требуется найти последовательность из n чисел, которые одновременно удовлетворяют каждому из m уравнений, то говорят о системе уравнений. Для решения систем уравнений в Scilab также применяют функцию fsolve(x0,f).
-->x=-%pi/2:0.1: %pi/2;
-->y=sqrt((1-0.9*(x^2))/2);
-->y(1)=(atan(x^2)-0.3)/x;
-->plot2d(x,y,style=[color("red")]);
-->xgrid()
-->plot(x,y(1),style=[color("blue")]);
--> function [y]=fun(x)
-->y=sqrt((1-0.9*(x^2))/2);
-->y(1)=(atan(x^2)-0.3)/x;
endfunction
-->exec(’D:\scilab 3\fun’);disp(’exec done’); exec done
-->fsolve([-1 1 1],fun)//решение системы
ans = ! 0.2236068 0.2236068 0.4853982 !
Рисунок 4.1 Решение системы уравнений
5 Обработка экспериментальных данных
5.1 В результате эксперимента была определена некоторая табличная зависимость. С помощью метода наименьших квадратов определить линию регрессии, рассчитать коэффициент корреляции, подобрать функциональную зависимость заданного вида, вычислить коэффициент регрессии. Определить суммарную ошибку.
U |
0 |
1 |
1.5 |
2 |
2.5 |
3 |
3.5 |
4 |
4.5 |
5 |
V |
12 |
10.1 |
11.58 |
17.4 |
30.68 |
53.6 |
87.78 |
136.9 |
202.4 |
287 |
Решение:
Метод наименьших квадратов позволяет по экспериментальным данным подобрать такую аналитическую функцию, которая проходит настолько близко к экспериментальным точкам, насколько это возможно. Задача сводится к определению коэффициентов ai из условия. Для реализации этой задачи в Scilab предусмотрена функция:
[a,S]=datafit(F,z,с)
где F – функция, параметры которой необходимо подобрать;
z – матрица исходных данных;
c – вектор начальных приближений;
a – вектор коэффициентов;
S – сумма квадратов отклонений измеренных значений от расчетных.
//Функция, вычисляющая разность между экспериментальными
//и теоретическими значениями.
//Перед использованием необходимо определить
//z=[x;y] - матрицу исходных данных - и
//с - вектор начальных значений коэффициентов,
//размерность вектора должна совпадать
//с количеством искомых коэффициентов.
-->function[zr]=F(c,z)
-->zr=1/(z(2)-c(1)-c(2)*z(1));
-->endfunction
//Исходные данные
-->u=[0 1 1.5 2 2.5 3 3.5 4 4.5 5];
-->v=[12 10.1 11.58 17.4 30.68 53.6 87.78 136.9 202.5 287];
//Формирование матрицы исходных данных
-->z=[u,v];
//Вектор начальных приближений
-->c=[0,0];
//Решение задачи
-->[a,S]=datafit(F,z,c);
S = 3.936D-19
a =
10^9 *
- 2.9534336
- 1.0693236
Для расчета коэффициентов регрессии в Scilab предназначена функция:
a=regress(x,y)
где x и y — экспериментальные данные, a — вектор коэффициентов линии регрессии a1 и a2.
-->a= regress(u, v)
a =
- 56.134675
52.255065
Коэффициент корреляции:
-->r=sum((u-mean(u)).*(v-mean(v)))/sqrt(sum((u-mean(u))^2)*sum((v-mean(v))^2))
r = 0.8762687
Индекс корреляции:
-->R=sqrt(1-sum((v-(a(1)+a(2)*u))^2)/sum((v-mean(v))^2))
R = 0.8762687
Построение графика экспериментальных данных и линии регрессии:
t=0:7; Yt=a(1)+a(2)*t;
plot2d(u,v,-5); plot2d(t,Yt)
Рисунок 5.1 График экспериментальных данных и линия регрессии
5.2 Найти приближенное значение функции при заданном значении аргумента с помощью функции линейной интерполяции.
x1=0.314 x2=0.235 x3=0.186
x |
0.11 |
0.15 |
0.21 |
0.29 |
0.35 |
0.40 |
y |
9.05421 |
6.61659 |
4.69170 |
3.35106 |
2.73951 |
2.36522 |
Решение:
В Scilab для построения линейной интерполяции служит функция:
y=interpln(z,x)
где z — матрица исходных драных; x — вектор абсцисс; y — вектор значений линейного сплайна в точка x.
-->x= [0.11 0.15 0.21 0.29 0.35 0.40];
-->y= [9.05421 6.61659 4.69170 3.35106 2.73951 2.36522];
-->plot2d (x, y, -4);
-->koeff= splin(x, y);
-->X=[0.314 0.235 0.186];
//Значение функции в заданных точках
-->Y=interp (X, x, y, koeff)
Y = 3.0780427 4.1822309 5.2957873
-->plot2d (X, Y, -3) //Нанесение точек на график
//Построение кубического сплайна
-->t=0.11:0.01:0.40;
-->ptd=interp(t, x, y, koeff);
-->plot2d(t, ptd)
