Базовые средства матпакета Scilab
.pdf-->Uo = 1;
--> // Загрузка и выполнение сценария РИС2324
--> exec('РИС2324.sce', 0) --> mprintf('Cd = %g ' ,Cd); Cd = 8
Рис.2.3.2-4. Вычисление дифференциальной ёмкости нелинейного элемента Построить касательную к функцииf(x)=(3*x2-7)/(2*x+1) (рис. 2.3.2-4).
221
Рис.2.3.2-5. Построение уравнения и графика производной функции
Вычисление производной от табличной функции
Если функция задана таблично, то для вычисления значения производной в точке, необходимо предварительно получить значения конечных разностей, поскольку в основе численного дифференцирования, как уже отмечалось выше, лежит аппроксимация функции, от которой берется производная, заменяемая интерполяционным многочленом Ньютона
y
( y |
0 |
|
|
y |
|
2 |
|
|
|
|
0 |
3 |
y |
|
/ 2! |
0 |
|
|
|
/
3! |
...) / |
h
.
Именно поэтому численное дифференцирование еще называют
аппроксимированным дифференцированием.
Для получения конечных разностей, входящих в состав интерполяционного многочлена, в Scilab используется функция diff, которая может иметь один из следующих форматов:
dy=diff(y); dy=diff(y,n); dy=diff(y,n,dim),
где y– вектор или матрица (вещественная, комплексная или полиномиальная) табличных значений функции;
n – порядок конечных разностей (целое число), по умолчанию значение n равно 1;
dim – размерность матрицы, по которой происходит вычисление конечных разностей. Размерность может принимать значения как 'r', 'c' или 1, 2 соответственно (по строкам или столбцам), так и'*' (по всем элементам матицы). По умолчанию значение dim равно "*", то есть запись diff(y,n) равносильна записи diff(y,n,'*').Если параметр dim имеет значение 'r', то это эквивалентно записи dim=1, а dim='c' – эквивалентно dim=2.
dy – скаляр или матрица значений конечных разностей.
Формат dy=diff(y) предназначен для вычисления разностей между соседними значениями y (y(2:$)-y(1:$-1)), поскольку по умолчанию n=1. При использовании формата dy=diff(y,n) функция diff вычисляет n- конечные разности, а использование формата dy=diff(y,n,dim) позволяет вычислить n-ые разности при заданной размерности dim.
На рис.2.3.2-4 приведен пример вычисления значений производной от функции y(x)=log10(x), заданной в виде таблицы. Зная аналитическое выражение для производной от функции y(x) (y'=1/ln(10)/x), в примере проведена проверка результата, полученного при использовании функции
diff.
222
- -> // Вычисление значений производных для функции, заданной таблично
--> |
|
--> x = 10 : 5 : 25; |
h = 5; |
--> y = log10(x); |
// Дифференцируемая функция |
--> --> // Конечные разности 1-го, 2-го и 3-го порядка
--> dy = diff(y); dy2 = diff(y, 2); dy3 = diff(y, 3); -->
--> // Приближенные значенияy'(x) в точкахx = 10, 15, 20
--> y10 = (dy(1) - dy2(1)/2 + dy(1)/3) / h y10 =
0.0520729
--> Y15 = (dy(2) - dy2(2)/2) / h Y15 =
0.0277906 -->Y20 = dy(3) / h Y20 =
0.019382
-->
--> // Значения производных функции log10(x)
--> (1/log(10)) ./ x(1:$-1) ans =
0.0434294 0.028953 0.0217147
Рис. 2.3.2-4. Вычисление производных по таблице значений функции
На рис. 2.3.2-5 показана еще одна возможность приближенного вычисления производных функции y=sin(x), заданной таблично. Принимая во внимание, что для исходной функции известно аналитическое выражение производной (y'=cos(x)), с помощью функции norm (норма матрицы), можно получить значение максимального отклонения приближенных значений производных от их соответствующих точных значений, полученных по аналитической формуле.
--> |
// |
Аппроксимированное дифференцирование |
|
|
|||
--> |
x = 1 : 0.01 : 1.05; |
h = 0.01; |
|
|
|
||
--> |
// |
Функция, от которой берется производная |
|
|
|||
--> |
y = sin(x); |
|
|
|
|
||
--> |
// |
Аппроксимированное вычисление производной функции |
|
||||
--> |
dy |
= diff(sin(x) ./ h) |
|
|
|
|
|
dy |
= |
|
|
|
|
|
|
|
0.536086 |
0.5276177 |
0.5190967 |
0.5105238 |
|
|
|
--> |
y1 |
= cos(x) // Производная от функции sin(x) |
|
|
|||
y1 |
= |
|
|
|
|
|
|
|
0.5403023 |
0.5318607 |
0.523366 |
0.5148188 |
0.5062203 |
|
|
--> // |
Максимальный элемент вектора модулей разностей |
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
223
--> norm(dy - cos(x(1:$ - 1)), %inf) ans =
0.0043204
Рис. 2.3.2- 5. Аппроксимированное дифференцирование Поскольку результат выполнения функции norm(V,%inf) равен
значению максимального элемента вектора Vпо модулю, то в данном он равен
значению 0.0043204.
2.3.3. Постановка задачи численного интегрирования
Интегрирование – это распространенная математическая операция для решения многих задач науки и техники. С его помощью проводят вычисление площадей, скорости, ускорения, перемещения и многое другое. Интегрирование простых функций можно легко провести аналитически, но чем сложнее подынтегральная функция, тем труднее, а иногда невозможно, получить точное значение интеграла. Следует также отметить, что, если в курсах математического анализа подынтегральная функция обычно задана аналитически, то в прикладных задачах она может быть задана в виде таблицы, поскольку здесь часто используются данные экспериментов.
Определенный интеграл в общем виде имеет вид:
b
s f(x)dx,
a
где: f(x)– подынтегральная функция; а и b – пределы интегрирования.
Исходя из геометрической интерпретации, значение интеграла sчисленно равна площади области, ограниченной графиком функции,
осью абсцисссОX и двумя прямымиx=а и x=b. При численном интегрировании
эта область разбивается на несколько частей, вычисляется площадь каждой маленькой части, а затем они суммируются. Существует множество численных методов, которые отличаются способами разбиения области интегрирования на части и способами вычисления площади каждой из этих частей [22].
Суть всех формул численного интегрирования состоит в том, что на элементарных отрезках интегрирования подынтегральную функцию заменяют простейшим интерполяционным полиномом, который легко может быть проинтегрирован в аналитическом виде. Так, например, для получения формул прямоугольников, трапеций и Симпсона используют полиномы соответственно нулевой, первой и второй степени.
224
2.3.4. Численное вычисление определенных интегралов средствами Scilab
Вычисление определенных интегралов – inttrap
В системе Scilab для вычисления определенного интеграла |
|
b |
y(x) x |
|
|||
|
a |
|
формуле трапеций используется функция inttrap, имеющая формат:
по
s=inttrap(y) s=inttrap(x,y),
где y– подынтегральная функция y(x), заданная таблично;
x– вектор значений независимой переменной – необязательный параметр, если он отсутствует, то элементы вектора х принимают значения номеров вектора y.
Функция inttrap вычисляет площадь области, ограниченной функцией y(x), которая описана набором точек (x,y). Простейший пример использования функции inttrapприведен на рис. 2.3.4-1.
Здесь подынтегральная функция задается 11-ю узловыми точками, где х меняется от 1 до 10 с шагом0.5, а функция y принимает в этих точках те же значения.
--> // Пример использования функции inttrap
-->
--> x = 1 : 0.5 : 10; // Вектор аргументов
--> y = 1 : 0.5 : 10; // Вектор значений подынтегральной функции
-->s = inttrap(x, y) s =
49.5
Рис.2.3.4-1. Пример использования функции inttrap
На рис. 2.3.4-2 приведены несколько примеров вычисления значений определенных интегралов методом трапеций. В последнем примере для функции интегрирования использован формат inttrap(y). Поэтому здесь в соответствии с форматом функции inttrap произошла замена элементов вектора х номерами элементов вектора y, в результате чего получено другое значение интеграла. Система Scilab не выдала ошибки, поскольку в данном случае была вычислена площадь совершенно другой фигуры.
--> // Вычисления определенных интегралов функциейinttrap --> // Пример1
225
--> a = 5; b = 13; |
// Пределы интегрирования |
||
--> x = a : b; |
y = sqrt(2*x - 1); // Подынтегральная функция |
||
--> inttrap(x, y) |
// Вычисление интеграла с шагом 1 |
||
ans |
= |
|
|
32.655571 |
|
|
|
--> |
|
|
|
--> // Пример2 |
|
|
|
--> h = 0.1; |
x = a : h : b; y = sqrt(2*x -1); |
||
--> inttrap(x,y) // Вычисление интеграла с шагом 0.1 |
|||
ans |
= |
|
|
32.666556 |
|
|
|
--> |
|
|
|
--> // Пример3 |
|
|
|
--> inttrap(y) |
// Элементы вектора x равны номерам элементов вектора y |
||
ans |
= |
|
|
326.66556
Рис. 2.3.4-2. Вычисление определенных интегралов функцией inttrap
Вычисление определенных интегралов – integrate
Для вычисления интеграла по формуле Симпсона в Scilab применяется функция integrate, имеющая следующий формат:
integrate('f','x',a,b) integrate('f','x',a,b,,er1) integrate('f','x',a,b,,er1,er2),
где: f– функция, задающая подынтегральное выражение; x– независимая переменная;
a, b– пределы интегрирования – действительные числа;
er1 и er2 – необязательные параметры – абсолютная и относительная погрешности вычисления интеграла – действительные числа.
Примеры использования функции integrateпоказаны нарис.2.3.4-3. Особенность использование integrate состоит в том, что при обращении к этой функции шаг интегрирования не задается, а используются параметр er1 и (или) er2 (Пример1). Если погрешность вычисления интеграла отсутствует, то вычисление проводится с погрешностью, установленной по умолчанию (Пример2). По умолчанию значение er1 равно 1.D-8, а значение er2
равно 1.D-14.
--> // Вычисление интеграла с заданнойпогрешностью
--> --> // Пример1 Вычисление интеграла с абсолютной погрешность = .0001
--> q1 = integrate('(2*x - 1)^0.5', 'x', 5, 13, 0.0001)
226
q1 =
32.666667 -->
--> // Пример2 Вычисление интеграла с погрешность по умолчанию
--> q2 = integrate('(2*x - 1)^0.5', 'x', 5, 13) q2 =
32.666667 -->
--> // Пример3 Вычисление интеграла с погрешностью по умолчанию, --> // а подынтегральное выражение задано внутренней встроенной функцией
--> deff('y = fint((2 * x - 1)^0.5)', 'x', 5, 13) --> q3 = integrate('fint', 'x', 5, 13)
q3 =
32.666667
Рис.2.3.4-3. Вычисление определенных интегралов функцией integrate
Вычисление определенных интегралов функцией intg
Для интегрирования в Scilab имеется универсальная функция intg:
[s,er]=intg(a,b,f,er1,er2),
где: a, b– пределы интегрирования;
f – имя подынтегральной функции, которая может быть задана с помощью внешней функции или в виде набора дискретных точек и должна быть непрерывной;
er1 и er2– необязательные параметры – абсолютная и относительная погрешности интегрирования. Если погрешность вычисления интеграла отсутствует, то вычисление проводится с погрешностью, установленной по умолчанию (значение er1 равно 1.D-8, а значение er2 равно 1.D-14).
Функция intgвозвращает значение интеграла (s) и оценку абсолютной ошибки вычислений (er).
Внешнюю функцию можно задать функцией deffили function:
если f – функция, то её определение должно иметь видy = f(t);
если f – список, то этот список должен быть описан как:
list(f,x1,x2,…).
Рассмотрим несколько примеров (рис.2.3.4-4).
227
-->// Загрузка сценария РИС23404 и выполнение функции intg
--> |
exec('РИС23404.sce '); |
|
|
|
|
--> |
disp([" |
I |
", " |
er |
"], ... |
>[I1, er1], [I2, er2], [I3, er3], [I4, er4], [I5, er5]);
! |
I |
er |
! |
|
-3.58957861311877350 |
0.00000000001621547 |
|
|
-3.58957861320974690 |
0.00001678794315296 |
|
|
-3.58957862082392730 |
0.0015909785599586 |
|
|
-3.58957862082391800 |
0.00159097855998436 |
|
|
-3.58957861311831690 |
0.00000000781318699 |
|
Рис.2.3.4-4. Вычисление определенных интегралов функциейintg
Точность полученного результата зависит от заданной абсолютной погрешности. Поэтому очевидно, что в Примере1 и Примере5 обеспечена
максимальная точность. |
|
Опишем подынтегральную функцию y=cos(x)2/(1-x)в функции fi(x) |
и |
вычислим значение определенного интеграла (с пределами a=2 |
и |
b=6) сначала с помощью функции intg, а затем – функции inttrap, разбив при этом отрезок интегрирования на 5, 10 и 20 частей (рис.2.3.4-5).
- -> // Сравнение вычисления интеграла функциями intg и inttrapпо точности
--> -->// Описание подынтегральной функции
-->deff('[y] = fi(x)', 'y = cos(x).^2 ./ (1-x)') -->
-->a = 2; b = 6;
228
--> // Вычисление интеграла с помощью функции intg
--> [s,ir] = intg(a, b, fi) ir =
5.844D-10 s =
-0.8781216 -->
--> // Вычисление интеграла с помощью функцииinttrap
--> // s1–5 точек (h1=0.8); s2–10 (h2=0.4); s3–20 (h3=0.2);
--> h1 = 0.8; x = a:h1:b; y = fi(x); s1 = inttrap(x, y) --> h2 = 0.4; x = a:h2:b; y = fi(x); s1 = inttrap(x, y) --> h3 = 0.2; x = a:h3:b; y = fi(x); s1 = inttrap(x, y) --> z=[h1,s1; h2,s2; h3,s3]
z=
0.8 -0.8490697
0.4-0.8711676
0.2-0.8764039
Рис.2.3.4-5. Влияние величины шага на точность интегрирования
Из полученных результатов (рис.2.3.4-5) следует, что, если значение интеграла, полученное с использованием функции intg можно принять практически за точное значение (относительная погрешность 5.844D-10), то с помощью функции inttrap, использующей таблицу значений подынтегральной функции, мы только приблизились к этому значению. При этом из полученных результатов явно следует, что чем меньше значение шага интегрирования, тем точнее результат. А поскольку величина шага влияет на количество используемых узловых точек, то становится очевидным, что увеличение числа, используемых в расчете узловых точек приводит к получению более точного значения интеграла.
Рассмотрим несколько задач.
Построить график мгновенного напряжения uL(t) на катушке индуктивности L=0,5 Гн в интервале [0 1000] мc, если i(t)=exp(-t)-exp(2t)
(рис. 2.3.4-6).
229
L=0.5 Гн t=[0:50:1000]* 10D-3;
exec('РИС23406.sce', 0)
Рис.2.3.4-6. Связь между мгновенным током и напряжением в катушке индуктивности
Решим несколько задач.
Определить мощность, выделяемую в резисторе сопротивлением R=1Ом, если через него протекает ток гармонической формы с мгновенными значением i = sin(t)(Рис.2.3.4-7. ).
В ТЭЦ среднюю мощность Pможно выразить формулой: = 1 ∫0 ,
230