Основные операторы языка Scilab

Часто в процессе решения инженерных или физических задача, а также задач по математическому моделированию, возникает необходимость проверять корректность полученных данных, выполнять разные вычисления, в зависимости от полученных результатов, перебирать значения и т.д. Для этих нужд в Scilab существуют операторы цикла, присваивания, условные операторы, как и в других языках программирования.

Рассмотрим основные операторы, которые используются в процессе программирования в математическом пакете Scilab.

4.1 Операторы цикла for и while

Оператор цикла for

Оператор цикла for состоит из заголовка, содержащего условия его выполнения, исполняемого тела цикла. Форма записи представлена ниже:

for  j = jo:d:jmax
     операторы

end;

Здесь \( jo \) – это стартовое значение параметра,
\( d \) – значение, на которое увеличивается параметр \( j \) на каждом шаге \( j = j+d \),
\( jmax \) – конечное значение параметра \( j \).

Выполнение цикла начинается с присвоения  параметру \( j \) начального значения \( jo \). Если параметр удовлетворяет условию \( j \le jmax \),то выполняются операторы тела цикла. Затем параметр \( j \) увеличивается на величину \( d \), и снова происходит проверка на выполнение условия \( j \le jmax \).

Оператор заканчивает свою работу, как только значение \( j \) превышает \( jmax \), а управление передаётся следующим за телом цикла операторам.

В качестве примера использования оператора for , рассмотрим метод Рунге-Кутты численного интегрирования обыкновенного дифференциального уравнения.

Рассмотри дифференциальное уравнение

\( y'=f(x,y) \)

с начальным условием \( y(x_0)=y_0 \). Положим \( f(x,y)=sin(x)\).

Классический метод Рунге-Кутты 4-го порядка описывается следующей системой

\( y_{i+1} = y_i + {h\over6}(k_1 + 2k_2 + 2k_3+k_4) \)
где
\( k_1 = f(x_i, y_i) \)
\( k_2 = f(x_i+ {h\over2}, y_i+ {h\over2}k_1) \)
\( k_3 = f(x_i+ {h\over2}, y_i+ {h\over2}k_2) \)
\( k_4 = f(x_i+ h, y_i+ hk_3) \)

Таким образом, для нахождения численного решения дифференциального уравнения \( y' = sin(x) \) с иcпользованием метода Рунге-Кутты 4-го порядка, нам потребуется написать пользовательскую функцию (Листинг 10, строки 2-5), описывающую правую часть ОДУ.

Далее, задать отрезок интегрирования с некоторым шагом h, что соответствует строкам 7-10 Листинга 10. Заострим внимание читателя на том, что на строке 10 Листинга 10 мы сформировали строку из 101 элемента, а на строке 13 Листинга 10  -- вектор той же размерности. Обратите внимание, как задаются начальные условия (Листинг 10, строка 16).

Строки 19 – 27 Листинга 10 соответствуют реализации метода Рунге-Кутта, описанного выше. Результатом работы приложения будут графики решений ОДУ , полученных численно и аналитически (см. рис. 6).

Листинг 10. Реализация численного интегрирования ОДУ с помощью метода Рунге-Кутты. Листинг 10. Реализация численного интегрирования ОДУ с помощью метода Рунге-Кутты.

clf;clc;
//Описываем правую часть ОДУ
function dy = f(x,y)
    dy = sin(x)
endfunction

//Задаём разбиение отрезка интегрирования[t0, tmax] с шагом h
x0 = 0; xmax = 10;
h = 0.1;
X = x0:h:xmax;

//создадим вектор решения У необходимой размерности
Y = zeros(X);

//Задаём начальные условия 
Y(1) = 0.2;

//В цикле пробежим все точки отрезка интегрирования
for j = 1:length(X)-1
    
    k1 = f(X(j), Y(j));
    k2 = f(X(j) + h/2, Y(j) + h*k1/2);
    k3 = f(X(j) + h/2, Y(j) + h*k2/2);
    k4 = f(X(j) + h, Y(j) + h*k3);
    
    Y(j+1) = Y(j) + (h/6)*(k1 + 2*k2 + 2*k3 + k4);   
end
plot(X,Y, ".r");
plot(X, -cos(X) + 1 + Y(1), "b");
xgrid();
xtitle("Метод Рунге-Кутты 4-го порядка решения ОДУ", "x", "y");
legend("Численное решение ОДУ", "Аналитическое решение ОДУ", -6)
Рисунок 6. Сравнение аналитического и численного решений ОДУ. Рисунок 6. Сравнение аналитического и численного решений ОДУ.

Оператор цикла while

Оператор цикла while состоит из заголовка, содержащего условия его выполнения, исполняемого тела цикла. Форма записи представлена ниже:

while условие
   операторы
end;

Выполнение цикла начинается с проверки условия на истинность. Если условие истинно, то выполняются операторы тела цикла. Затем снова происходит проверка на истинность условия.

Оператор заканчивает свою работу, как только значение условие нарушается, а управление передаётся следующим за телом цикла операторам.

Приведём пример использования данного оператора. Попросим пользователя ввести радиус \( R=5\). При этом, если пользователь введёт число, не превосходящее 5, условие прекращения цикла не будет выполнено и запрос на ввод радиуса повторится. При вводе корректного значения в консоли, мы выводим его в командном окне (строка 8) и присваиваем переменной R введённое пользователем значение (см. листинг 11).


/* Работа цикла while */
R=0;
while (R < 5) 
    clc;
    R = input('Введите радиус R  больше 5');    
end;
disp("R=");
disp(R);
Листинг 11. Демонстрация работы цикла while, оператора присваивания и ввода данных в командном окне Scilab..

4.2 Условный оператор if

Для проверки выполнения каких-либо условий в программе используется условный оператор if. Это один из основных операторов языка, и он имеет две формы записи: обычную и расширенную.

Обычная форма записи позволяет выбрать одно из двух условий и выполнить соответствующие действия.

if условие then
   операторы 1
else
   операторы 2
end;

Расширенная форма записи позволяет работать с конечным числом условий и выполнять соответствующие корректному условию операторы. В данном случае, поочередно проверяются все условия от 1 до n-го. Если ни одно из условий не выполнилось, выполняются операторы по ветке else.

if условие1 then
   операторы 1
elseif условие2
   операторы 2
elseif условие3
   операторы 3
   
else
   операторы
end;

В качестве примера, напишем пользовательскую функцию, которая будет вычислять значения функции \( f(x) = \begin{cases} 2x, & x>0 \\ -x^2, & \text{иначе} \end{cases} \) на промежутке \( [-2; 2] \) с шагом \( d=0.1 \) (листинг 12). В данном случае в функцию myfunc() передаются два входных параметра: массив точек абсцисс \( Х \) и шаг \( d \).

В теле пользовательской функции на строке 2 вычисляется длина массива, а на следующей строке, функцией zeros(), создаётся массив нулевых элементов совместного размера для записи значений функции.
Далее, внутри цикла for производится перебор всех элементов входного массива \(х\), а условный оператор if передаёт управление операторам вычисления значения функции в точке \( x(j) \) , в зависимости от выполнения условия положительности или неотрицательности \(j-го \) элемента.


/* Использование опертора if */
clc; clf;
function z = myfunc(x, d)
    el = length(x); 
    z = zeros(el);
    for j = 1:1:el
        if (x(j) > 0) then            
            z(j) = 2*x(j)
        else            
            z(j) = -x(j)^2
        end
    end;
endfunction;

d = 0.1;           // задаём шаг
X = -2:d:2;        // задаём промежуток для переменной x
Y = myfunc(X, d);  // вызываем пользовательскую функцию myfunc

plot(X,Y, "r");
plot(zeros(X), Y, "k");
plot(X, zeros(Y), "k");
xgrid;
Листинг 12. Задание функции \( f(x) = \begin{cases} 2x, & x>0 \\ -x^2, & \text{иначе} \end{cases} \) при помощи пользовательской функции, использования оператора цикла и условного оператора.
Рисунок 6a. График функции \( f(x) \). Рисунок 6a. График функции \( f(x) \).

Комментарии

Гость
Ответить
Войдите, чтобы оставить комментарий.
Гость
Ответить
Гость
Ответить
Гость
Ответить
Еще нет комментариев, оставьте первый.