- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
83
Замечание 6.2.
Более полная информация о двумерных графиках вы можете найти в книге
Алексеев Е.Р., Чеснокова О.В. Пакет Scilab. Начало работы (ссылка на пособие дана во введении).
2) Анимация на плоскости
Задача №1.
По кривой, заданной функцией y = sin(x), скользит квадрат (брусок). Построить анимацию.
Листинг 6.4.
//настраиваем back-buffer (буферная анимация, т.е. все кадры сохраняются в буфере, затем // буфер прокручивается - начинается анимация)
f = gcf(); clf();
f.pixmap = "on";
//Точки кривой, по которой катится квадрат
maxL = %pi*8; // максимальная абсцисса xpCurve = [0:.1:maxL]; // по оси X ypCurve = sin(xpCurve); // и по оси Y
//настройка временных задержек для анимации realtimeinit(0.1); realtime(0);
//Квадрат едет вперед - x его абсцисса
for x=0:0.1:maxL do realtime(x*5); // задержка
clear_pixmap(); // очистка экрана clf(f);
//это ограничивающий объем square(0, -1, maxL, maxL);
//рисуем кривую plot2d(xpCurve, ypCurve);
//вычисляем ординату середины нижней стороны y = sin(x);
l = atan(cos(x)); // угол наклона касательной к кривой в точке
vx = cos(l); vy = sin(l); // вектор касательной, направленный вперед px = x-vx; py = y-vy; // "задняя" точка нижней стороны
vx = 2*vx; vy = 2*vy; // вектор нижней стороны
// подгонка, чтобы квадрат не провалился if (sin (px) > py | sin (px+vx) > py+vy) then
84
py = sin(px);
vy = sin(px+vx)-py;
end;
// рисуем квадрат
xpoly([px, px+vx, px+vx-vy, px-vy], [py, py+vy, py+vy+vx, py+vx], "lines", 1); show_pixmap(); // вывод буфера
end;
Задача №2.
По кривой, заданной функцией y = cos(x), перекатывается квадрат (брусок). Построить анимацию.
Листинг 6.5. f = gcf();
clf();
f.pixmap = "on";
// Кривая, по которой перекатывается квадрат maxL = %pi*4;
xpCurve = [0:.1:maxL]; ypCurve = cos(xpCurve);
realtimeinit(0.1); realtime(0);
x = 0; y = 1; // координаты угла, на котором катится квадрат w = -0.1; // скорость поворота относительно угла
l = 1.5; // начальный угол поворота t = 0; // время
while x < maxL do t = t +0.1; realtime(t*5); clear_pixmap(); clf(f);
square(0, -1, maxL, maxL); plot2d(xpCurve, ypCurve);
vx = cos(l); vy = sin(l); // вектор-сторона квадрата
if (cos(x+vx) > y+vy) then // произошел ли перекат на другой угол?
//меняем угол x = x+vx;
y = cos(x);
//строим ортогональный вектор-сторону tmp = -vy;
vy = vx; vx = tmp;
//корректируем величину угла поворота l = %pi/2+l;
end;
85
// упирается ли квадрат стороной
ch = [1/3, 1/2, 4/5]; // три эмпирически взятые точки проверки for d = ch do
// проваливается ли квадрат под кривую в этой точке? tmp = cos(x+d*vx) - d*vy;
if (tmp > y) then
// приподнимем квадрат и продвинем немного вперед delta = tmp - y;
y = tmp;
x = x+delta*vx/2;
end;
end
// корректируем угол поворота l = l+w;
xpoly([x, x+vx, x+vx-vy, x-vy], [y, y+vy, y+vy+vx, y+vx], "lines", 1); show_pixmap();
end;
3) Простейшие трёхмерные объекты
1) Сфера (Листинг 6.6):
u = linspace(-%pi/2,%pi/2,40); v = linspace(0,2*%pi,20);
X = cos(u)'*cos(v); // Вспоминаем сферическую систему координат
Y = cos(u)'*sin(v);
Z = sin(u)'*ones(v); // X,Y,Z должны быть одинакового размера plot3d2(X,Y,Z);
// Получаем сферу, заданную параметрически, радиуса 1;
Смотрим рис.6.4:
86
Рис.6.4. Сфера (шар)
2)Куб (Листинг 6.7):
x= [1,1,1,1,0,0; // массив абсцисс
0,0,0,0,1,1;
0,0,0,0,1,1];
y= [1,1,0,0,0,0; // массив ординат
1,1,0,0,0,0;
0,0,1,1,1,1];
z= [1,0,0,1,1,0; // массив аппликат
1,0,0,1,1,0;
1,0,0,1,1,0];
plot3d2(x,y,z); // куб строится по граням, грани из прямых, прямые из
// точек: [x(1), y(1), z(1)] – первая точка
Смотрим рис.6.5:
87
Рис.6.5.КУБ
3) Плоскость (Листинг 6.8): t=0:0.5:12;
deff('[z]=surf(x,y)','z = 1-x'); // рисуем плоскость с помощью внешней
// функции
fplot3d(t,t,surf,45,70); // см. рис.6.6
4) Карта ландшафта (Листинг 6.9):
Z = [ 0.0001 0.0013 0.0053 -0.0299 -0.1809 -0.2465 -0.1100 -0.0168 -0.0008 -
0.0000 |
|
|
|
|
|
|
|
|
|
|
|
0.0005 |
0.0089 |
0.0259 |
-0.3673 |
-1.8670 |
-2.4736 |
-1.0866 |
-0.1602 |
-0.0067 |
0.0000 |
||
0.0004 |
0.0214 |
|
0.1739 |
|
-0.3147 |
-4.0919 |
-6.4101 |
-2.7589 |
-0.2779 |
0.0131 |
0.0020 |
-0.0088 |
-0.0871 |
0.0364 |
1.8559 |
1.4995 |
-2.2171 |
-0.2729 |
0.8368 |
0.2016 |
0.0130 |
||
-0.0308 |
-0.4313 |
-1.7334 |
-0.1148 |
3.0731 |
0.4444 |
2.6145 |
2.4410 |
0.4877 |
0.0301 |
||
-0.0336 |
-0.4990 |
-2.3552 |
-2.1722 |
0.8856 |
-0.0531 |
2.6416 |
2.4064 |
0.4771 |
0.0294 |
||
-0.0137 |
-0.1967 |
-0.8083 |
0.2289 |
3.3983 |
3.1955 |
2.4338 |
1.2129 |
0.2108 |
0.0125 |
||
-0.0014 -0.0017 0.3189 2.7414 7.1622 7.1361 |
3.1242 |
0.6633 |
0.0674 |
0.0030 |
|||||||
0.0002 |
0.0104 |
|
0.1733 |
|
1.0852 |
2.6741 |
2.6725 |
1.1119 |
0.1973 |
0.0152 |
0.0005 |
0.0000 |
0.0012 |
|
0.0183 |
|
0.1099 |
0.2684 |
0.2683 |
0.1107 |
0.0190 |
0.0014 |
0.0000]; |
surf(Z,'facecol','interp'); |
// см. рис.6.7 |
|
|
|
|
|
|||||
88
Рис.6.6.Плоскость
Рис.6.7.Ландшафт
