- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
78
end
end
endfunction |
|
|
xx = [0, 0.25, 0.5, 0.75, 1]; |
//узлы интерполирования |
|
f = sin(xx); |
|
|
d = 0.6; |
|
|
printf("Linear: %g %g\n", interpolateLinear(d, xx, f, 5), sin(d)); |
//вывод результатов |
|
– первое число – приближенное значение |
|
|
Рис. 4. Результат работы листинга_5. 4
6) Кусочно-кубические сплайны
Функция S(x) называется кубическим сплайном, если существует N
полиномов Sk (x) с |
коэффициентами |
sk ,0 , sk ,1 , sk ,2 , sk ,3 , |
удовлетворяющих |
условиям: |
+ sk ,1 (x − xk ) + sk ,2 (x − xk )2 + sk ,3 (x − xk )3 , |
|
|
• S(x) = Sk (x) = sk ,0 |
для x [xk , xk +1 ] и |
||
_________
k = 0, N −1, то есть сплайн состоит из кубических полиномов.
• Кусочно-кубическое интерполирование задается совокупностью точек,
_____
таких, что S(xk ) = yk для k = 0, N .
•Кусочно-кубическое представление состоит из кривых, которые являются гладкими непрерывными функциями. Вторая и первая
производная |
должны |
быть |
непрерывны: |
Sk (xk +1 ) = Sk +1 (xk +1 ), |
S'k (xk +1 ) = S'k +1 (xk +1 ), |
S''k (xk +1 ) = S''k +1 (xk +1 ) . |
|
Наиболее часто используется кубический сплайн следующего вида: |
|||
S3 (x) = ai +bi (x − xi ) + ci (x − xi )2 + di (x − xi )3 . |
|||
Коэффициенты ai , bi , ci , di |
подбираются так, |
чтобы |
S3 (xi ) = yi , а первая и |
вторая производная были непрерывны.
Приведем теперь реализацию данного метода интерполирования в системе Scilab. Найдем приближенное значение функции f (x) = sin x в точке x = 0.6 .
79
Листинг 5.5.
//Кусочно-кубические сплайны
function y=interpolateCubicSpline(x, xx, f, n) u = n-1;
z = zeros(n); alpha = zeros(n); b = zeros(n);
//Вычисление z методом прогонки z(1) = 0;
z(n) = 0; alpha(2) = 0; b(2) = z(1); for i = 2:n-1 do
Ai = xx(i) - xx(i-1);
Bi = 2 * (xx(i+1)-xx(i-1)); Ci = xx(i+1)-xx(i);
Fi = 6 * ((f(i+1)-f(i))/(xx(i+1)-xx(i)) -(f(i)-f(i-1))/(xx(i)-xx(i-1))); alpha(i+1) = -Bi / (Ai*alpha(i)+Ci);
b(i+1) = (Fi - Ai*Bi) / (Ai*alpha(i)+Ci);
end;
for i = n-1:-1:2 do
z(i) = alpha(i+1)*z(i+1)+b(i+1);
end;
//Вычисление значения
y = "nan"; for i = 1:n-1 do
if (x >= xx(i) & x <= xx(i+1)) then hi = xx(i+1)-xx(i);
y = (z(i+1)*(x-xx(i))^3 + z(i)*(xx(i+1)-x)^3) / (6*hi) + (f(i+1)/hi - hi/6*z(i+1)) * (x-xx(i)) + (f(i)/hi - hi/6*z(i)) * (xx(i+1)-x);
end;
end; endfunction
xx = [0, 0.25, 0.5, 0.75, 1]; |
//узлы интерполирования |
|
f = sin(xx); |
|
|
d = 0.6; |
|
|
printf("Cubic: %g %g\n", interpolateCubicSpline(d, xx, f, 5), sin(d)); |
//вывод |
|
результатов – первое число – приближенное значение |
|
|
Рис. 5. Результат работы листинга_5. 5
80
Глава_6. Графические объекты в Scilab
1)Примеры построения графиков.
1.Чтобы нарисовать простейший график, обратимся к функции plot (x1,y1, x2, y2, …, xn, yn), где x1, y1 – массивы абсцисс и ординат
первого графика; x2, y2 – массивы абсцисс и ординат второго графика; xn, yn – массивы абсцисс и ординат n-ого графика. Например:
Листинг. 6.1.
x = -6.28 : 0.02 : 6.28; // задаем матрицу аргументов (область определения) y = sin(x/2); // 1-ый график
z = cos(x); // 2-ой график
v = exp(cos(x)); // 3-ий график plot (x,y,x,z,x,v); // вывод графиков
В результате появится графическое окно (рис.6.1):
Рис.6.1. Графическое окно
81
Надеюсь, вы смогли догадаться, где какой график? Если нет, значит будем рисовать по – другому.
2. Функцию plot можно использовать следующим образом: plot(x1, y1, s1, x2, y2, s2, …, xn, yn, sn), где x1, x2, …, xn – массивы абсцисс графиков; y1, y2, …, yn – массивы ординат графиков; s1, s2, …, sn – строки,
состоящие из трех символов, которые определяют цвет линии, тип маркера и тип линии графиков:
Листинг 6.2.
x = -6.28 : 0.02 : 6.28; // задаем матрицу аргументов y = sin(x/2); // 1-ый график
z = cos(x); // 2-ой график
v = exp(cos(x)); // 3-ий график
plot (x,y, 'k*--'); // чёрный цвет графика, штриховая линия из * plot (x,z, 'r>:'); // красный цвет графика, пунктирная линия из > plot (x,v, 'g.-'); // зелёный цвет графика, сплошная линия из точек
В результате появится графическое окно (рис.6.2):
Рис.6.2. Графическое окно
82
Замечание 6.1.
plot (x, v, 'g'); - третий параметр может состоять не обязательно из 3-ёх символов (можно из одного или из двух).
3. Рисуем график в привычном (по крайней мере, для меня) виде.
Листинг 6.3.
x=[-2*%pi:0.1:2*%pi]; // область определения y=[sin(x); cos(x)]; // массив функций
//здесь используется функция plot2d; axesflag=5 – означает, что координатная сетка
//расположена в середине рисунка, leg="sin(x)@cos(x) – подписываем графики
plot2d(x,y', style = [color("red"), color("blue")], axesflag=5, leg="sin(x)@cos(x)");
В результате появится графическое окно (рис.6.3):
Рис.6.3. Графическое окно
