Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базовые средства матпакета Scilab

.pdf
Скачиваний:
63
Добавлен:
04.04.2023
Размер:
6.29 Mб
Скачать

-->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