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

Scilab / SciLab

.pdf
Скачиваний:
110
Добавлен:
31.12.2018
Размер:
4.38 Mб
Скачать

Замечание: Интересно, что вычисления в пакетах Scilab разных версий (2.6 и 2.7) могут дать различные результаты. Версии 2.7 нужно гораздо меньшее число итераций для сходимости. Радует, что производитель работает над собой!

Метод наименьших квадратов

Метод наименьших квадратов является частным случаем применения команды datafit.

Пример 1.

В качестве экспериментальной кривой зададим функцию, близкую к квадратичной: возьмем квадратичную кривую и наложим на нее с помощью генератора случайных чисел небольшой "шум".

x=[0:0.1:10];

y=20+30*x+50*x^2; e=1000*(rand(1,length(x))-0.5); //это шум y1=y+e;

plot2d(x,y1,[5]) ; // красный цвет - "экспериментальная кривая"

Будем считать узлы (x,y1) модельными "экспериментальными" данными. f=[x;y1]; //строим матрицу

// определим функцию ошибки deff("[e]=G(a,z)","e=z(2)-a(1)-a(2)*z(1)-a(3)*z(1)^2"); a0=[1;1;1]; //ввод начальных параметров

// найдем для модельной функции G значения коэффициентов разложения aa(1),aa(2) и aa(3)

[aa,er]=datafit(G,f,a0);

yy=aa(1)+aa(2)*x+aa(3)*x^2;

plot2d(x,yy,[2])

Результат:

12

Красной линией изображены "экспериментальные данные", синей линией изображена модельная кривая, построенная с помощью метода наименьших квадратов.

Замечание: Команда datafit выполняется в течении нескольких минут: имейте терпение.

Пример 2. Разберемся на этом примере, что представляет собой значение параметра er, возвращаемое командой datafit.

x=[1 2 3 5 9]; y=[3 4 7 9 17]; plot2d(x, y,[5]); f=[x;y];

deff("[e]=G(a,z)","e=z(2)-a(1)-a(2)*z(1)-a(3)*z(1)^2"); a0=[1;1;1];

[aa,er]=datafit(G,f,a0);

yy=aa(1)+aa(2)*x+aa(3)*x^2;

plot2d(x,yy,[2]);

e=(y-yy)^2; // это вектор ошибки приближения

d=sum(e) // Сумма элементов вектора. Она совпадает с er.

Практически получили аппроксимацию прямой линией, так как значение одного из элементов вектора коэффициентов a очень мало. Значение погрешности апроксимации - эта величина delta, вычисляющаяся как корень квадратный из суммы квадратов отклонений, деленный на число измерений (данных).

n=sum(x);

delta=sqrt(n(2));

Мы убедились, что значение ошибки вычислений er, которую нам возвращает команды datafit равно сумме квадратов отклонения экспериментальных значений от значений модельной функции (иначе сумма квадратов остатков = sum of squared residuals =RSS). Для большого количества точек эта величина может быть велика.

13

SCILAB: Библиотеки

Глава 3. Интегрирование

Содержание главы:

Как вычислить определенный интеграл?

o Команда intsplin: метод сплайн-интерполяций o Команда inttrap: метод трапеций

o Команда integrate: метод квадратуры

oКоманда intg: интегрирование подинтегральная функции, заданной извне

Как вычислить интеграл Коши?

Как вычислить определенный интеграл?

Способ 1.

С помощью команды intsplin. Это интегрирование экспериментальных данных с помощью сплайн-интерполяции. Известно значение интегрируемой точки в дискретных точках (узлах).

Синтаксис

v = intsplin([x,] s)

Параметры

x : вектор x координат данных, упорядоченных по возрастанию. Значение по умолчанию

1:size(y,'*')

s : вектор y координат данных. v : значение интеграла

Вычисляется численное значение определенного интеграла от функции f(x) в пределах от x0 от x1.

При вычислении функция f описывается экспериментальными значениями так, что s(i)=f(x(i)) и x0=x(1), x1=x(n).

Между узловыми точками функция интерполируется с использованием сплайна.

Пример.

Это численное интегрирование дискретно заданной функции y(x)=x2 в интервале [1,6]. Аналитически вычисленное значение его =63/3-1/3=71.666667 .

x=[1.,2.,3.,4.,5.,6.];

y=[1,4,9,16,25,36];

1

v=intsplin(x,y)

Результат:

v = 71.666667

Способ 2.

С помощью команды inttrap. Интегрирование экспериментальных данных с помощью трапецеидальной интерполяции (метод трапеций).

Синтаксис

v = inttrap([x,] s)

Параметры

x : вектор координат x, упорядоченный по возрастанию. По умолчанию принимает значение 1:size(y,'*')

s : вектор y координат данных (значения интегрируемой функции). si=f(xi) v : значение интеграла

Вычисляется

где функция f описана набором экспериментальных значений в узлах:

s(i)=f(x(i)) и x0=x(1), x1=x(n)

При вычислении интеграла между соседними узлами функция интерполируется линейно. Этот метод вычислений называется методом трапеций.

Пример.

t=0:0.1:%pi;

inttrap(t,sin(t))

Результат:

ans =

1.9974689

Способ 3.

С помощью команды integrate. Это интегрирование по квадратуре. Может задаваться требуемая точность вычислений.

Синтаксис

[x]=integrate(expr,v,x0,x1 [,ea [,er]])

Параметры

expr : внешний объект Scilab

v : строка (переменная интегрирования)

x0, x1 : действительные числа (пределы интегрирования)

ea, er : действительные числа (предельная абсолютная ошибка). По умолчанию принимает значение 0.

er : действительное число, (предельная относительная ошибка). По умолчанию принимает значение 1.d-8.

2

Вычисляется

Функция f задана в виде аналитической зависимости от v.

Оценка надежности вычисления удовлетворяет следующему требованию точности: abs(I-x)<= max(ea,er*abs(I)), где I означает истинное значение интеграла.

Пример.

integrate('sin(x)','x',0,%pi) integrate(['if x==0 then 1,'; 'else sin(x)/x,end'],'x',0,%pi)

Способ 4.

С помощью команды intg. Интегрируемая функция задана извне: либо в виде набора дискретных точек, либо вычисляется с помощью внешней подпрограммы. Может задаваться требуемая точность вычислений.

Синтаксис

[v,err]=intg(a,b,f [,ea [,er])

Параметры

a, b : действительные числа

f : внешняя (функция или список строк) ea, er : действительные числа

ea : требуемая абсолютная ошибка точности вычисления. По умолчанию принимает значение 0.

er : относительная ошибка точности вычисления. Принимает значение по умолчанию 1.d-

8

err : оценка абсолютной ошибки результата. Вычисляется определенный интеграл от a до b от f(t)dt.

Оценка точности вычислений: abs(I-v)<= max(ea,er*abs(I)), где I - точное значение интеграла.

Функция f может быть:

1)задана в дискретных узловых точках

2)именем внешней процедурой, написанной на языке, например, fortran.

3)записанной в виде строки как list(f,x1,x2,...)

Метод вычислений в описании не указан.

Пример.

deff('[y]=f(x)','y=x*sin(30*x)/sqrt(1-((x/(2*%pi))^2))') exact=-2.5432596188;

abs(exact-intg(0,2*%pi,f))

3

Как вычислить интеграл Коши?

Вспомним: Интегралом Коши (Cauchy) называется комплексный или криволинейный интеграл.

Способ 1.

С помощью команды intc. Вычисляется интеграл от a до b от f(z)dz вдоль прямой линии комплексной плоскости.

Синтаксис

[y]=intc(a,b,f)

Параметры

a, b : два комплексных числа

f : "внешняя" функция, принимающая комплексные значения

Способ 2.

С помощью команды intl. Синтаксис

[y]=intl(a,b,z0,r,f)

Параметры

z0 : комплексное число

a, b : два действительных комплексных числа r : положительное действительное число

f : "внешняя" функция, принимающая комплексные значения

Вычисляется интеграл функции f(z)dz вдоль кривой в комплексной плоскости, определенной z0+ r.exp(%i*t) для a<=t<=b. Это часть круга с центром z0 и радиусом r с фазой между a и b.

4

SCILAB: Библиотеки

Глава 4. Дифференциальные уравнения

Содержание главы:

Краткий русско-английский словарь употребляемых терминов дифференциального исчисления

С помощью каких команд можно решить дифференциальное уравнение?

Солвер ode для решения обыкновенного дифференциального уравнения

Как установить режим вычислений с помощью для солвера дифференциальных уравнений ode?

Как решить уравнение Риккати (Riccati)?

Приближенное определение производных функций должно всегда проводиться с особой осторожностью, так как известно, что дифференцирование, в противоположность интегрированию, сопровождается "разбалтыванием". Это означает, что у производной ухудшается свойство гладкости.

Краткий русско-английский словарь употребляемых терминов дифференциального исчисления

Обыкновенные дифференциальные уравнения (ОДУ)

Правая часть дифференциального уравнения Уравнение дифференциальное жесткое Жесткая задача

Дифференциальное алгебраическое уравнение

Ordinary Differential Equation (ODE)

Right Hand Side (RHS) stiff differential equation stiff problem

Differential Algebraic System Solver = dassl

С помощью каких команд можно решить дифференциальное уравнение?

Способ 1.

С помощью команды ode, которая является солвером для решения обыкновенного дифференциального уравнения.

Способ 2.

С помощью команды odedc, которая вычисляет решение смешанной дискретнонепрерывной системы. Смотри подробно help odedc.

Способ 3.

Команда dassl, которая дает решение неявно выраженного дифференциального уравнения: g(t,y,ydot)=0

y(t0)=y0 и ydot(t0)=ydot0

1

Смотри подробно help dassl. Детальный пример дан в файле

SCIDIR/tests/dassldasrt.tst

Способ 4.

С помощью команды impl, которая дает решение неявно выраженного линейного дифференциального уравнения

A(t,y) dy/dt=g(t,y), y(t0)=y0

Смотри подробно help impl. Смотри также пример в файле

SCIDIR/routines/default/Ex-impl.f .

Солвер ode для решения обыкновенного дифференциального уравнения

Солвер служит для решения обыкновенного дифференциального уравнения (ОДУ) dy/dt=f(t,y) , y(t0)=y0

Синтаксис

y=ode(y0,t0,t,f)

[y,w,iw]=ode([type],y0,t0,t [,rtol [,atol]],f [,jac] [,w,iw]) [y,rd,w,iw]=ode("root",y0,t0,t [,rtol [,atol]],f [,jac],ng,g [,w,iw]) y=ode("discrete",y0,k0,kvect,f)

Параметры

y0 : действительное число или матрица (условия инициализации) t0 : действительный скаляр (время инициализации)

t : действительный вектор. Задает интервал времени для которого вычисляется решение уравнения.

f : внешний параметр (функция или строка или список).

type : строковая переменная принимающая одну из следующих значений:

"adams" "stiff" "rk" "rkf" "fix" "discrete" "roots"

rtol, atol : действительные константы и действительные константы того же размера, что и y.

jac : внешний параметр (функция или строка или список). w, iw : действительные вектора.

ng : целое число.

g : внешний параметр (функция или строка или список). k0 : целое число (начальное время).

kvect : целочисленный вектор.

Команды ode является стандартной функцией для решения явной "ODE" системы определенной следующим образом:

dy/dt=f(t,y), y(t0)=y0.

Имеется интерфейс для разнообразных солверов, в частности для ODEPACK. (ODEPACK=Differential Eguations PACKage. Это пакет для решения алгебраических дифференциальных уравнений.)

Способ решения проблемы и метод зависят от значения первого опционного аргумента, который может принимать значения из следующего списка:

: по умолчанию будет вызываться солвер пакета ODEPACK. Автоматически пакетом

2

производится выбор между методом прогноза и коррекции (nonstiff predictor-corrector) для нежестких задач и методом BDF (Backward Differentiation Formula) Адамса-Мултона для жестких задач. Изначально используется метод для нежесткой задачи и динамический контроль результатов для того, чтобы решить, какой из методов следует использовать.

"adams": Используется для нежесткой задачи. Вызывается lsode солвер пакета ODEPACK и используется метод Адамса.

"stiff": Используется для жесткой задачи (stiff problems). Вызывается lsode solver пакета

ODEPACK и используется метод BDF (Backward Differentiation Formula). Этот метод схож с методом Адамса-Мултона (Adams-Moulton).

"rk": Используется адаптивный метод Рунге-Кутта (Runge-Kutta) 4-го порядка (RK4).

"rkf": Используется программа Shampine и Watts, основанная на методе Рунге-Кутта- Фельберга (Fehlberg's Runge-Kutta) 4-5-го порядка точности (RKF45) с автоматической оценкой ошибки. Этот опцион для нежестких (non-stiff) и умеренно-жестких (mildly stiff) задач, если оценка производной не важна. Этот метод не следует применять , если пользователю требуется высокая точность.

"fix": Используется тот же солвер, что и с значением параметра "rkf", но с очень простым интерфейсом для пользователя, т.е. необходимо задавать солверу только значение параметров. Это самый простой метод для начала.

"root": Используется ODE солвер со способностью нахождения корней. Используется lsodar солвер пакета ODEPACK. Это вариант lsoda солвера, в котором он находит корни заданного вектора функции. Подробно смотри help ode_root.

"discrete": Моделирование дискретного времени (Discrete time simulation). Подробно смотри help de_discrete.

Здесь мы описываем только использование команды ode для стандартных явных ODE систем. Простейщий вариант: y=ode(y0,t0,t,f), где y0 является вектором начальных условий; t0 - начальное время; t -вектор времени, за которое вычисляется решение y и y- вектор решений y=[y(t(1)),y(t(2)),...]. Функция f для команды ode определяется как внешняя, т.е. определена как scilab-функция или является именем Fortran или C функции, вызываемая соответствующим образом или задана списком (list). Если f является функцией, то синтаксис должен быть следующий:

ydot = f(t,y)

где t действительный скаляр (время) и y -действительный вектор (положение). Эта функция является правой частью (RHS=right hand side) дифференциального уравнения dy/dt=f(t,y). Если f задано символьной переменной, она отсылает к имени Fortran процедуры или C функции. Например, для команды ode(y0,t0,t,"fex"), fex будет именем вызываемой подпрограммы. Эту подпрограмму следует вызвать с помощью конструкции f(n,t,y,ydot). Внешняя подпрограмма может быть динамически линкована в Scilab. (Смотри главу 6: Интерфейс между программами, написанными на языках C и Fortran и пакетом Scilab).

Примеры таких программ находятся в файлах SCIDIR/routines/default/README и

SCIDIR/routines/default/Ex-ode.f.

Аргумент f может быть также задан списком. Для конструкции ode(y0,t0,t,lst)

3

параметр lst должен быть списком со следующей структурой: lst=list(f,u1,u2,...un)

ydot = f(t,y,u1,u2,...,un)

Это позволяет использовать параметры в качестве аргументов функции f. Функция f может возвращать вместо вектора матрицу размера p на q. Подробно смотрите help ode.

Замечание: Используя переменную %ODEOPTIONS, можно задать еще больше опционов для ODEPACK солверов. Подробно смотрите help odeoptions.

Пример 1.

Получим численное решение дифференциального уравнения dy/dt= f(t,y), где f=t*y(1/3) с начальные условия t0=1 и y0=1. Мы хотим получить численное решение этого уравнения в интервале значений t от tmin=1 до tmax=5 c шагом dt=0.01.

Поскольку известно, что это уравнение имеет точное аналитическое решение y(t)=((t2+2)/3)(3/2), мы сможем проверить полученный с помощью пакета Scilab результат.

y0=1;

t0=1;

t=1:0.01:1.5;

deff("[ydot]=f(t,y)","ydot=y^(1/3)*t")

y=ode(y0,t0,t,f);

//

y_exact=((t^2+2)/3)^(1.5); // это функция точного решения для сравнения my_er=y-y_exact;

plot(t,y-y_exact) // это график ошибки вычисления от аргумента t

Результат:

Важное замечание:

Начальные условия должны быть заданы в точке слева от минимальной координаты в интервале для которого мы находим численное решение дифференциального уравнения, то есть t0<=tmin. В противном случае (например, при начальных условиях t0=1 и y0=1 хотим найти решение в интервале t=0.8:0.1:5), вычисления не производится и поступает

4

Соседние файлы в папке Scilab
  • #
    31.12.20183.02 Кб366 tema.sce
  • #
    31.12.20181.07 Кб35ChemDifur6II.sce
  • #
    31.12.20181.43 Mб58introscilab-v1.3-ru.pdf
  • #
    31.12.2018753 б40Neyavnayashema.sci
  • #
    31.12.20181.94 Кб38Partialderivative.sci
  • #
    31.12.20184.38 Mб110SciLab.pdf
  • #
    31.12.2018709 б38syst333.sci
  • #
    31.12.2018266 б35tema2.sce
  • #
    31.12.2018361 б36tema5.sci