Материал: Matlab. Практический подход. Самоучитель

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Самоучитель Matlab

На заметку

Поскольку в общем случае решение неизвестно, то задача выбора начальной точки также представляется нетривиальной. С другой стороны, нередко успех в поиске решения системы уравнений принципиально зависит от того, насколько удачно выбрано начальное приближение. Для этого иногда приходится проводить дополнительное исследование, более объемное, чем сама процедура поиска решения.

Чтобы решить систему уравнений, используем команду z=fsolve (F,[0 1]). В результате получаем текстовое сообщение о результатах поиска решения и непосредственно результат вычислений в виде списка из двух элементов. Список присваивается в качестве значения переменной z. Элементы списка – решение системы уравнений. Как видим, это именно то решение, которое мы ожидали получить.

Разумеется, при решении системы уравнений вектор-функцию, определяющую уравнения системы, можно реализовать не только в командном окне, но и в m-файле. Рассмотрим программный код, представленный в документе на рис. 5.7.

Рис. 5.7. Программный код вектор-функции

Этим кодом определяется вектор-функция из трех элементов:

function y=Eqns(x) y(1)=x(1)+2*x(2)+x(3)-3; y(2)=2*x(1)^2+3*x(2)^2+x(3)^2-9; y(3)=x(1)+x(2)*x(3)-1;

end

Эта вектор-функция соответствует следующей системе алгебраиче-

ских уравнений: x

1

+ 2x

2

+ x

3

− 3 = 0 ,

2x2

+ 3x2

+ x2 − 9 = 0 и

x1

+ x2x3 −1 =

 

 

 

 

 

1

2

3

= −1,

0. У этой системы есть три решения: первое - x

x2

= 1, x3 = 2 ; второе - x1 = 5 3 , x2 = 1, x3

= −2 3 ; третье - x1 =1

17 11 ,

x2

= −3 11, x3

= 2 . Найдем

все три решения

с помощью функции

206

Глава 5. Решение уравнений и оптимизация

fsolve() и вектор-функции, определенной выше. Документ представлен на рис. 5.8.

Рис. 5.8. Поиск всех корней системы уравнений

Кроме обычных параметров функции fsolve() в данном случае используются дополнительные настройки, отменяющие режим вывода текстовой информации о результатах вычислений. Для этого используем команду opts=optimset('Display','off'). Затем в команде fsolve (@Eqns,[-2,2,3],opts) переменная opts указывается третьим аргументом функции fsolve(). В результате решение системы уравнений вычисляется, а текстовое сообщение не выводится.

На заметку

Дополнительные параметры для функции fsolve() задаются с помощью функции optimset() в обычном для Matlab формате – в одинарных кавычках указывается опция и через запятую ее значение. Результат вызова функции optimset() записывается в переменную, которая затем передается аргументом другой функции – например, функции fsolve().

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

Еще одна полезная функция, на которую хочется обратить внимание, позволяет находить корни полиномов. Напомним, что по-

линомом

степени n

от переменной

x называется выражение вида

P (x) = a xn +a xn−1

+... +a

n

x +a

n +1

. Таким образом, поскольку струк-

n

1

2

 

 

 

207

Самоучитель Matlab

тура полинома жестко фиксирована, для его вычисления достаточно знать значение переменной x и коэффициенты a1 , a2 ,...,an +1 . Если же речь идет о полиноме как о функциональной зависимости, то набора коэффициентов a1 , a2 ,...,an +1 достаточно для однозначного определения соответствующей функции. Если речь заходит об обработке полинома в Matlab, то, как правило, речь идет о списке коэффициентов полинома. Это простой, экономный

иэффективный подход.

На заметку

Если полином степени n , то для его однозначного определения необходимо указать n +1 коэффициент, то есть на единицу больше, чем степень полинома. Коэффициенты в списке необходимо указывать все, в том числе и нулевые. Положение коэффициента в списке определяет степень соответствующего слагаемого. Корнями полинома называются решения уравнения Pn(x) = 0 .

Для вычисления корней полинома используют функцию roots(). Аргументом указывается список коэффициентов полинома. Результатом возвращается список корней полинома. Пример представлен в документе на рис. 5.9.

Рис. 5.9. Вычисление корней полинома

Сначала командой a=[1,-10,16,0,-1,10,-16] создаем список коэффициентов полинома. Эти коэффициенты соответствуют полиному шестой степени P6(x) = x6 −10x5 +16x4 x2 +10x −16 . У полинома есть четыре действительных корня x = −1 , x = 1 , x = 2 , x = 8 и два комплексных x = i и x = −i (здесь i - мнимая единица: i2 = −1 ). Вычислить эти корни можно с помощью команды roots(a). В результате появляется список корней, в том числе и комплексных (см. рис. 5.9).

208

Глава 5. Решение уравнений и оптимизация

Вычисление корней уравнений в явном виде

Мы, конечно, все что можно, со своей стороны делаем, но не все мы можем. То есть мы можем, но совесть нам не позволяет.

Б. Ельцин

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

Простой и надежный метод решения уравнений – метод половинного деления. Метод используется для поиска корня уравнения f (x) = 0 на интервале значений аргумента от a до b . Необходимое условие для применимости метода (кроме непрерывности функции f (x)) состоит в том, чтобы функция f (x) принимала на границах интервала значения разных знаков, что математически можно записать в виде неравенства f (a)f (b) ≤ 0 . В этом случае на интервале поиска гарантированно находится, по крайней мере, один корень уравнения.

На заметку

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

На рис. 5.10 показан документ с кодом функции, предназначенной для решения уравнений методом половинного деления.

Код функции EqSolve() состоит из группы вложенных условных операторов. В нем также используется рекурсия. Проанализируем этот код:

function x=EqSolve(f,intl,eps) a=intl(1);

b=intl(2);

if f(a)*f(b)>0

error('Неверно указаны границы интервала поиска корня!'); else

x=(b+a)/2;

if abs(b-a)<2*eps return;

else

if f(a)*f(x)>0 a=x;

209

Самоучитель Matlab

Рис. 5.10. Окно редактора m-файлов с кодом функции для решения уравнений методом половинного деления

else b=x;

end

x=EqSolve(f,[a b],eps); end

end end

У функции три аргумента: указатель на функцию f, которая определяет решаемое уравнение, интервал поиска решения intl, а также точность вычисления корня eps. В качестве результата функцией возвращается значение корня уравнения. Результат записывается в переменную, которая в коде обозначена как x.

Командами a=intl(1) и b=intl(2) считываются элементы списка intl и запоминаются в переменных a и b. После этого в условном операторе проверяется условие f(a)*f(b)>0. Если это условие выполняется, то функция на границах интервала поиска решения принимает значения одинаковых знаков. В этом случае командой error('Неверно указаны границы интервала поиска корня!') выводится сообщение о том, что границы диапазона для поиска решения указаны неверно. Если условие f(a)*f(b)>0 не выполняется, можно начинать поиск решения. Начина-

210

Источник: https://studfile.net/preview/16433384/