Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЧМ_2012 / Лекции / Численные_методы.pdf
Скачиваний:
392
Добавлен:
09.06.2015
Размер:
1.99 Mб
Скачать

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. Графическое окно