- •Оглавление
- •Введение
- •Краткий обзор системы
- •Знакомство с интерфейсом Scilab
- •Функции, определяемые пользователем и процедуры
- •Циклы
- •Погрешность результата численного решения задачи
- •Приближенные вычисления определенных интегралов
- •Методы прямоугольников
- •Метод трапеций
- •Метод Симпсона
- •Квадратуры Гаусса
- •Методы Монте-Карло
- •Вычисление определенных интегралов в системе Scilab
- •Решение систем линейных алгебраических уравнений
- •Метод Гаусса
- •Формула Крамера
- •Метод простых итераций
- •Метод Зейделя
- •Метод отражений
- •Метод LU-разложений
- •Решение нелинейных алгебраических уравнений
- •Метод половинного деления
- •Метод секущих
- •Метод секущих (с изменяемым углом)
- •Метод Ньютона (касательных)
- •Метод Бернулли
- •Аппроксимация и интерполирование функций
- •Интерполяционный многочлен Лагранжа
- •Интерполяционная формула Ньютона
- •Интерполяционные формулы Гаусса
- •Линейная аппроксимация по методу наименьших квадратов
- •Кусочно-кубические сплайны
- •Анимация на плоскости
- •Анимация в пространстве
- •Метод Рунге-Кутта
- •Метод Эйлера
- •Метод Прогонки
- •Метод Пикара
- •Возможности Scilab для решения ОДУ
- •Список Литературы
89
5)Конус (Листинг 6.10): t=0:2*%pi/200:2*%pi; z= 0:0.1:10; [T,Z]=meshgrid(t,z);
X=Z.*cos(T);
Y=Z.*sin(T);
plot3d2(X,Y,Z, , 70, -100) // см рис. 6.8
Рис.6.8.Конус
4) Анимация в пространстве
Задача №3.
Сфера заданного радиуса скользит по плоскости. Нарисовать анимацию.
Листинг 6.11.
//заданный радиус r = 1.0;
//рисуем плоскость z = 1-x t = 0:0.5:12;
90
deff('[z]=surf(x,y)','z=1-x');
// функция рисования шара function[] = procedure_(i);
// константы подобраны эмпирически
deff("[x,y,z] = sph(alp,tet)",["x = r*cos(alp).*cos(tet) + i";.. "y = r*cos(alp).*sin(tet) + 5";..
"z = r*sin(alp) - i + 2.5"]);
[xx,yy,zz] = eval3dp(sph,linspace(-%pi/2,%pi/2,25),linspace(0,%pi*2,25)); plot3d(xx,yy,zz, 45, 70);
endfunction;
f = gcf();
f.pixmap = 'on'; //set the pixmap mode
// основной цикл анимации for i = 1:0.1:12
fplot3d(t,t,surf,45,70); procedure_(i); show_pixmap(); clf();
end
Смотрим очередной рисунок 6.9
Рис.6.9. Кадр из анимации
Ниже приведен текст программы, рисующей анимацию для крутящегося шара, скользящего по плоскости:
Листинг 6.12.
r = 1.0; //радиус шара
// угол наклона плоскости(от угла зависит скорость скатывания) b = 10;
91
b = b*%pi/180; k = tan(b);
t = 0:12:12;
deff('[z] = surf(x,y)','z = 1-k*x'); function[] = procedure_(i);
deff("[x,y,z] = sph(alp,tet)",["x = r*cos(alp).*cos(tet)+i+1.2";.. "y = k*r*cos(alp).*sin(tet)-k*i+3";..
"z = r*sin(alp)+10"]);
[x,y,z] = eval3dp(sph,linspace(-%pi/2,%pi/2,8),linspace(0-i,%pi-i,10)); [x1,y1,z1] = eval3dp(sph,linspace(-%pi/2,%pi/2,8),linspace(%pi-i,%pi*2-i,10)); plot3d(x,z,y,,,,[12,1,0]);
plot3d(x1,z1,y1,,,,[20,1,0]);
fplot3d(t,t,surf,65,80);
endfunction;
f = gcf();
f.pixmap = 'on'; //set the pixmap mode
for i = 1:0.05*(k+0.5):12 procedure_(i); show_pixmap(); clf();
end
Задача №4.
Куб скользит по плоскости.
Листинг 6.13.
// построение матриц куба для plot3d2 function ret = getcube
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];
ret = tlist(["cb", "x", "y", "z"], x, y, z); endfunction;
//поворот куба вокруг осей x, y, z на углы a, b, c function ret = rot(cube, a, b, c)
//матрицы преобразования поворота в трехмерном пр-ве
A = [1,0,0,0;
0, cos(a), sin(a), 0; 0, -sin(a), cos(a), 0; 0, 0, 0, 1];
92
B = [cos(b), 0, -sin(b), 0; 0, 1, 0, 0;
sin(b), 0, cos(b), 0; 0,0,0,1];
C = [cos(c), sin(c), 0, 0; -sin(c), cos(c), 0, 0; 0, 0, 1, 0; 0, 0, 0, 1];
M = A*B*C; // общее преобразование
//Применяем преобразование для всех точек куба for i=1:length(cube.x) do
U = [cube.x(i), cube.y(i), cube.z(i), 1] * M; cube.x(i) = U(1);
cube.y(i) = U(2); cube.z(i) = U(3);
end
ret = cube; endfunction
//смещение куба вдоль осей
function ret = mov(cube, x, y, z) for i=1:length(cube.x) do
cube.x(i) = cube.x(i)+x; cube.y(i) = cube.y(i)+y; cube.z(i) = cube.z(i)+z;
end
ret = cube; endfunction
//рисование плоскости function drawPlane
x = [6, 6; 0, 0]; y = [-1, 2;
-1, 2]; z = [0,0;
1,1];
plot3d2(x, y, z); endfunction
//рисование куба function drawCube(cube)
plot3d2(cube.x,cube.y,cube.z); endfunction
f = gcf(); clf();
f.pixmap = "on";
// подготовка куба - поворот и смещение вверх из (0,0,0) к плоскости cube = mov(rot(getcube(), 0, atan(1/6), 0), 0, 0, 1);
realtimeinit(.1);
93
for x = 0:0.1:4 do realtime(x*10); clear_pixmap(); clf(); square(0,-1,6,2);
// перемещение куба
cube = mov(cube, .1, 0, -0.0166667); drawCube(cube);
drawPlane; show_pixmap(); end;
// Смотрим на рис.6.10
Рис.6.10. Кадр из анимации
