- •Основы работы и программирования, компьютерная математика Учебный курс
- •Isbn ооо «Харвест», 2008
- •Предисловие
- •Введение
- •Глава 1 знакомство с matlab и простейшие вычисления
- •1.1. Рабочая средаMatlab
- •1.2. Арифметические вычисления
- •1.3. Вещественные числа
- •1.4. Форматы вывода результата вычислений
- •1.5 Комплексные числа
- •1.6 Векторы и матрицы
- •1.7 Встроенные функции. Функции, задаваемые пользователем
- •1.8 Сообщения об ошибках и их исправление
- •1.9 Просмотр и сохранение переменных
- •1.10 Матричные и поэлементные операции над векторами и матрицами
- •1.11 Решение систем линейных уравнений
- •Вопросы для самопроверки
- •Глава 2 работа с массивами
- •2.1 Создание векторов и матриц
- •2.2 Применение команд обработки данных к векторам и матрицам
- •2.3 Создание специальных матриц
- •2.4 Создание новых массивов на основе существующих
- •2.5 Вычисление собственных значений и собственных векторов. Решение типовых задач линейной алгебры
- •Вопросы для самопроверки
- •Глава 3 м-файлы
- •3.1 Файл-программы
- •3.2 Файл-функции
- •Вопросы для самопроверки
- •Глава 4 программирование
- •4.1 Операторы отношения и логические операторы
- •4.2 Операторы цикла
- •4.3 Операторы ветвления
- •4.4 Оператор переключения switch
- •4.5 Оператор прерывания цикла break
- •4.6 Пример сравнения быстродействия матричных и скалярных операций
- •Вопросы для самопроверки
- •Глава 5 высокоуровневая графика
- •5.1 2D графика
- •5.1.1 Графики в линейном масштабе
- •5.2 Специальные виды 2d - графиков
- •5.2.1 Представление функции в виде дискретных отсчетов
- •5.2.2 Лестничные графики
- •5.2.3 Графики с указанием погрешности
- •5.2.4 Графики в логарифмическом и полулогарифмическом масштабах
- •5.2.5 Графики параметрических функций
- •5.3 3D графика
- •5.3.1 Линейчатые поверхности
- •5.3.2 Каркасные поверхности
- •5.3.3 Контурные графики
- •5.3.4 Сплошная освещенная поверхность
- •5.4 Оформление, экспорт и анимация
- •5.4.1 Оформление графиков
- •5.4.2 Сохранение и экспорт графиков
- •5.4.3 Анимация
- •Вопросы для самопроверки
- •Глава 6 прикладная численная математика
- •6.1 Операции с полиномами
- •6.2 Решение уравнений и их систем
- •6.3 Минимизация функции одной переменной
- •6.4 Минимизация функции нескольких переменных
- •6.5 Вычисление определенных интегралов
- •6.6 Решение дифференциальных уравнений
- •6.7 Аппроксимация и интерполяция данных
- •6.8 Интерполяция двумерных и многомерных данных
- •Вопросы для самопроверки
- •Глава 7 символьные вычисления
- •7.1 Символьные переменные, константы и выражения
- •7.2 Вычисления с использованием арифметики произвольной точности
- •7.3 Команды упрощения выражений – simplify, simple
- •7.4 Команда расширения выражений – expand
- •7.5 Разложение выражений на простые множители – команда factor
- •7.6 Приведение подобных членов – команда collect
- •7.7 Обеспечение подстановок – команда subs
- •7.8 Вычисление пределов – команда limit
- •7.9 Вычисление производных – команда diff
- •7.10 Вычисление интегралов – команда int
- •7.11 Разложение в ряд Тейлора – команда taylor
- •7.12 Вычисление суммы ряда – команда symsum
- •7.13 Решение уравнений и их систем – команда solve
- •7.14 Решение дифференциальных уравнений – команда dsolve
- •7.15 Прямое и обратное преобразования Лапласа – команды laplace,ilaplace
- •7.16 Графики символьных функций – команды ezplot, ezpolar
- •7.17 Прямой доступ к ядру системы Maple – командаmaple
- •7.18 Разложение рациональной дроби на сумму простейших дробей
- •7.19 Интерполяционный полином Лагранжа
- •7.20 Решение неравенств и систем неравенств
- •7.21 Разложение в ряд Тейлора функции нескольких переменных
- •7.22 Решение дифференциальных уравнений с помощью степенных рядов
- •7.23 Решение тригонометрических уравнений
- •Вопросы для самопроверки
- •Приложения Приложение 1. Справочная система matlab
- •Приложение 2. Знакомство с пакетами расширения системыMatlab
- •Приложение 3. Задания для самостоятельной работы
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Варианты
- •Литература
6.2 Решение уравнений и их систем
Команда fzero вычисляет вещественный корень уравнения f(x)=0.
Команда fzero имеет следующие модификации:
fzero('f(x)', x0);
fzero('f(x)', [x1, x2]).,kk
В выражениях функции приняты следующие обозначения:
'f(x)' – решаемое уравнение или имя файл-функции (в одинарных кавычках), вычисляющей левую часть уравнения;
x0 – начальное приближение (значение) искомого корня;
[x1, x2] – область изоляции корня.
Команда fzero имеет и другие модификации, о которых можно узнать с помощью команды doc fzero.
Пример:
Вычислить корни уравнения lnx-x+3 = 0на отрезке[0;5].
Решение:
Создадим файл-функцию myfun, вычисляющую значение функции lnx - x+3 при заданном значении аргумента x:
function y=myfun(x)
y=log(x)-x+3;
Перед нахождением корней построим график исследуемой функции командой fplot и нанесем сетку (рис. 6.1):
>> fplot ('myfun',[0,5])
grid
Рис. 6.1
Пояснения на графике нанесены средствами MATLAB. На графике видно, что функция на этом отрезке имеет два корня, расположенные вблизи 0,1 и 4,5. Уточним значение второго корня при помощи fzero:
>> x2=fzero('myfun',4.5)
x2 =
4.5052
Итак, приближенное значение второго корня равно х2 = 4,5052. Вместо начального приближения 4,5 вторым параметром fzero можно задать интервал [4;5], на котором следует найти корень:
>> x2=fzero('myfun',[4,5])
x2 =
4.5052
Отметим, что на границах указываемого интервала функция должна принимать значения разных знаков, иначе выдается сообщение об ошибке.
Получить приближенное значение корня и значение функции в этой точке позволяет вызов fzero с двумя выходными аргументами:
>> [x2,f]=fzero('myfun',[4,5])
x2 =
4.5052
f =
-4.4409e-016
То, что значение функции близко к нулю, вообще говоря, не означает, что приближенное значение корня расположено достаточно близко к его точному значению.
Для того, чтобы увидеть больше значащих цифр корня х2, установим формат long и выведем х2 еще раз (точность вычислений не зависит от формата вывода результата):
>> format long
>> x2
x2 =
4.50524149579288
Найдем корень х1, расположенный около 0,1:
>> format long
>> x1=fzero('myfun',.1)
x1 =
0.05246909745771
Возникает вопрос, сколько в ответе точных значащих цифр, т. е. с какой точностью найдено решение? Задание точности вычислений обсуждается ниже в разделах 6.4, 6.5.
Важной особенностью fzero является то, что она вычисляет только те корни, в которых функция меняет знак, а не касается оси абсцисс. Найти корень уравнения x2 = 0 при помощи fzero нельзя (получим сообщение об ошибке).
Многомерным аналогом fzero является команда fsolve, предназначенная для решения системы нелинейных уравнений F(X) = 0. Одна из модификаций fsolve имеет вид fsolve('file', x0). Здесь
file – имя файл-функции, вычисляющей вектор-столбец левых частей системы уравнений,
x0 – вектор-столбец начальных приближений.
Первый входной аргумент можно задать как указатель на файл-функцию @»file.
Пример:
Решить cистему нелинейных уравнений
Решение:
Возникают вопросы:
1) имеет ли система вещественные решения?;
2) если вещественные решения есть, то как определить их начальные приближения?
Т. к. система имеет второй порядок, то ответ на эти вопросы легко найти графическим способом. С помощью команды ezplot (см. разд. 7.16), cтроим совместно графики парабол x2+y=3 и y2+x=2 на рис. 6.2:
>> ezplot('x^2+y-3')
>> hold
Current plot held
>> ezplot('x+y^2-2')
>> grid
Рис. 6.2
Как видно на рис. 6.2 система имеет 4 вещественных решения (количество точек пересечения графиков), а одно из них имеет начальное приближение (-1;2). Уточним его с помощью команды fsolve.
Создадим файл-функцию mfun2, вычисляющую вектор-столбец левых частей системы уравнений:
function F=mfun2(x)
F=[x(1)^2+x(2)-3;x(2)^2+x(1)-2];
Программа и результаты решения системы уравнений имеют вид:
>> x0=[-1;2];
>> X=fsolve('mfun2',x0)
X =
-1.1117
1.7640
Получить одновременно приближенное решение и значения левых частей системы уравнений (функций x2+y - 3 и y2+x - 2) при подстановке в них этого решения позволяет вызов fsolve с двумя выходными аргументами:
>> [X,f]=fsolve(@mfun2,x0)
X =
-1.1117
1.7640
f =
1.0e-008 *
0.0445
0.2242
Таким образом, (x;y)=(-1,1117;1,7640) – одно из приближенных вещественных решений системы. Изменяя стартовые значения (согласно рис. 6.2), можно найти и остальные вещественные решения.
Пример:
Решить cистему уравнений третьего порядка
Решение:
Для такой системы нельзя найти области начальных приближений графическим способом. Создадим файл-функцию mfun3, вычисляющую вектор-столбец левых частей системы уравнений:
function F=mfun3(x)
F=[x(1)+x(1)^2-2*x(2)*x(3)-.1;x(2)-x(2)^2+3*x(1)*x(3)+.2;x(3)+x(3)^2+2*x(1)*x(2)-.3];
Для произвольного стартового значения решения (-1;0;0) программа и результаты решения системы уравнений имеют вид:
>> x0=[-1;0;0];
>> [X,f]=fsolve('mfun3',x0)
X =
-1.0880
-0.1303
0.0161
f =
1.0e-007 *
0.3447
-0.2521
0.2590
Итак, (x;y;z)=(-1,0880; -0,1303; 0,0161) – одно из приближенных вещественных решений системы. Изменяя стартовые значения, можно попытаться найти и другие вещественные решения этой системы.
Команда fsolve имеет и другие модификации, о которых можно узнать с помощью команды doc fsolve.
Команда fsolve также применима для решения одного нелинейного уравнения. В этом случае ее первый аргумент задает скалярную функцию, а вектор x0 – совокупность начальных приближений. Например:
>> fsolve(@sin,[0:3:12])
ans =
0 3.1416 6.2832 9.4248 12.5664
дает совокупность решений уравнения sin(x) = 0, наиболее близких к соответственным стартовым точкам массива х0.
При решении используется оптимизационный алгоритм, осуществляющий минимизацию невязки F(X). Поэтому команда fsolve способна найти нули, в том числе и таких функций, как x2 и .
Существенный недостаток команд fzero и fsolve состоит в том, что они не определяют комплексных решений уравнений и систем уравнений. Команда solve пакета Symbolic дополняет эти команды. С ее помощью в разделе 7.13 будут найдены другие решения рассмотренных выше систем уравнений, в том числе и комплексные.