Численные методы решения уравнений в среде MatLab
В этом посте я расскажу о численных методах решения уравнений, что очень удобно для их расчёта на компьютере. Приведу 3 вида и 3 примера кода, для каждого вида соответственно, а также расскажу о предостерегающих трудностях и путях их решения.
Иногда нам приходится решать уравнения, кому-то по работе, а кому-то понадобилась для домашних нужд — назовём это так. В школе нас учили, что для решения уравнения, необходимо выразить искомую переменную и тогда мы получим символьное решение уравнения, а если вместо букв поставить числа, то получим численное решение того или иного уравнения. Однако, бывают такие уравнения, в которых нельзя явно выразить искомую переменную, например, уравнение ниже.
Решать такие уравнения приходиться численно, то есть получая ответ в виде числа, а если вам нужна зависимость, то придётся задать диапазон начальных условий и получить, соответственно, диапазон значений искомого параметра.
Предлагаю вам ознакомиться с моей презентацией, а после чего прочитать комментарии и пояснения к ней ниже. Также, в конце записи я опубликовал листинги программ для расчёта указанными методами в среде MatLab.
При решении уравнений 2 или 3 типа, может возникнуть ситуация , когда из большого шага между двумя значениями x и(или) y, мы можем не достичь требуемой точности и тогда результат будет не предсказуем. Для избежания таких случаев предлагаю использовать не сравнение результата с заданным уровнем точности, а сравнение точностей для каждого значения переменной и выбор значения с наибольшей точностью. Подробнее расскажу на примере кода. Рекомендую использовать следующей алгоритм действий для уравнений типа f(x)=const:
- разбиваете заданный диапазон значений на n равных интервалов и получаете n+1 значений x
- решаете уравнение для каждого значения х
- выбираете то значение хi, при котором точность максимальна.
- из п. 3 следует, что точное решение находится между хi-1 и хi+1. Устанавливаете новый диапазон значений для x от хi-1 до хi+1, сохраняя то же число интервалов.
- Вновь расчитываете уравнение для нового интервала с новым шагом
- Повторяете указанные действия до тех пор, пока интервал значений х не будет достаточно мал, чтобы получить требуемую точность вычислений.
Аналогичный алгоритм, лишь с некоторым поправками, можно использовать и для решения уравнений вида f(x,y)=y.
Листинг программы для решения уравнений вида f(x)=x в среде MatLab
Если кому интересно, то ниже производится решение следующего уравнения относительно γ.

Дисперсионное соотношение
% Задаём исходные данные lamda=632.8*10^-9; % Длина волны излучения k0=2*pi/lamda; % Расчитвыаем волновое число d2=1*10^-6; % Толщина волноводного слоя n1=1.335; % Показатель преломления чистого полимера n2=1.7476; % Показатель преломления подложки CTK19 n3=1; % Показатель преломления среды - воздух eps=10^-6; % Задаём точность gamma_cp=1.3; % Задаём приближённое значение razn=1; % Задаём начальное значение разности x(i+1)-x(i). Значение должно быть заведомо больше eps. i=0; % Зададим начальное значение счётчика итераций. % Зададим уравнение как функцию g(d2,gamma_cp,k0,n1,n2,n3), где все аргументы, кроме gamma_cp являются константами, т.е. по сути g(gamma_cp)=gammka_cp. g=inline('sqrt(n2^2-((atan(sqrt((gamma_m^2-n1^2)/(n2^2-gamma_m^2)))+atan(sqrt((gamma_m^2-n3^2)/(n2^2-gamma_m^2))))/(k0*d2))^2)'); // начинаем циклический подсчёт while(razn>eps) < % выполняем цикл пока не достигнем требуемой точности i=i+1; % увеличиваем на единицу количество выполненых итераций gamma_temp=g(d2,gamma_cp,k0,n1,n2,n3); % расчитываем итерацию razn=abs(gamma_temp-gamma_cp); % расчитываем погрешность gamma_cp=gamma_temp; % Устанавливаем результат данной итерации как приближённое значение искомой переменной gamma_cp >gamma_cp % Выводим на экран результат вычислений i % Выводим на экран количество пройденых итераций
Листинг программы для решения уравнений вида f(x,y)=y в среде MatLab
Этот код решает следующее уравнение относительно θ.

Эффективный показатель преломления
gamma=[1:0.0001:1.33]; % Задаём диапазон значений гаммы for i=[1:length(gamma)] % Выполняем тело цикла для каждого значения гаммы от первого до последнего % Задаём вспомогательные и служебные переменные razn=100; tetz=0; raz=100; run=1; teta_n=61.6*pi/180; % Задаём начальное значение угла (определено приближениями) % Высчитываем значение с точностью до 1/10 угловой секунды while(run) teta_n=teta_n+pi/(180*60*60*10); razn=abs(gamma(i)-np*sin(beta+asin(sin(teta_n)/np))); % Если текущее значение имеет более высокую точность, чем предыдущее, то записываем это значение и его погрешность. if razn=(61.7*pi/180) run=0; end end teta_m(i)=tetz*180/pi; % Переводим результат в градусы и записываем в массив ответов end
На выходе данной программы получаем массив значений угла θ. Границы диапазона θ от 61.7 до 61.8 найдены путём последовательных приближений. Сначала уравнение решалось для всех гамма в пределах угла от 1 до 90 с шагом в 1 градус, затем диапазон сужался по тому же принципу, что и в случае с предыдущем кодом, и действия повторялись до достижения требуемой точности.
Если у вас есть какие-либо вопросы, замечания или предложения, то их в комментариях к данному посту! Удачных вам математических расчётов!
Как решить уравнение в матлаб
Решение уравнений в среде программирования MATLAB.
Для решения уравнений или систем уравнений в среде MATLAB используются процедуры fzero и fsolve. Рассмотрим ситуации , в каких случаях применяется процедура fzero. Процедура fzero служит для нахождения нулей функции одного переменного . Рассмотрим решение такой задачи : необходимо найти значение , при котором функция равна вблизи точки .
Если функция имеет вид более сложный вид , чем приведенный выше пример , то имеет смысл создать отдельный m- файл ( файл — функцию ).
В этом случае формат вызова процедуры fzero будет следующим :
Рассмотрим окружность и найдем значение , когда , если предварительно известно , что решение находится вблизи точки , абцисса которой .
По сути дела двумерную задачу , мы сведем к одномерной . Для этого сформируем следующую файл — функцию :
Формат вызова процедуры fzero применительно к данной задаче будет таким :
Рассмотрим подробно данный вариант вызова процедуры fzero.
@fun2 – вызов файл — функции под названием fun2 из текущего ( активного ) каталога MATLAB.
2 – начальное значение аргумента ,
optimset – встроенная процедура MATLAB, заслуживающая отдельного обсуждения .
1 – значение аргумента , входяшего в процедуру fzero как дополнительный параметр .
Другими словами , данный вариант вызова означает следующее : при заданном значении найти такое , что является истинным условие .
При помощи процедуры fzero решить следующие задачи :
1. Найти точки пересечения двух кривых и
2. Найти точку экстремума функции
3. Дан треугольник ABC: A(-1;-2), B(-1;4), C(5;4). Найти координаты основания перпендикуляра , опущенного из точки B на сторону AC.
4. Дана функция , дана точка A(0;-10). Найти на функции точку B такую , что прямая (AB) является касательной к графику функции .
5. Найти основание перпендикуляра , опущенного из точки A(3;10) на окружность радиуса 4, с центром в начале координат .
6. Из всех прямоугольников площади S найти тот , периметр которого наименьший . Величина S должна входить в процедуру fzero как дополнительный параметр .
7. На графике функции определить точки , касательная в которых имеет угол наклона .
8. Опустить перпендикуляр из точки A(10;5;8) на поверхность сферы радиуса 4, с центром в начале координат .
9. Найти точку на окружности точку наиболее удаленную от точки А (5;8).
10. Найти наибольший объем конуса с длиной образующей равной 4.
11. Найти наибольший объем цилиндра , вписанного в шар радиуса 10.
12. В шар радиуса 10 вписать цилиндр с наибольшей полной поверхностью .
13. Из всех треугольников , вписанных в окружность радиуса 100, найти такой , имеющий максимальную площадь . Одна из сторон треугольника равна 50.
14. Определить минимум функции .
15. Определить угол под которым видна окружность из точки А (5;5).
Решение уравнений в MathCad

Для решения уравнений в Mathcad можно воспользоваться двумя способами:
Использование метода Given — Find:
Это наиболее распространенный способ решения обычных алгебраических уравнений. Он достаточно прост. В рабочем поле записываем слово Given. Это служебное слово. Оно подключает определенные программные модули mathcad для обработки исходных данных, необходимых для решения уравнения численными методами.
Затем указывается начальное приближение для искомой переменной. Это нужно для увеличения скорости и точности решения уравнения. Если начальное приближение не задать, то mathcad по умолчанию примет его равным нулю
Рис. 1. Ввод данных в поле mathcad
Далее вводится уравнение. Его можно записать в явном или неявном виде. Само уравнение набирается с клавиатуры вручную с использованием панели Calculator. Из этой панели можно взять основные математические операции: дроби, тригонометрию, факториалы и прочее. Уравнение нужно записывать с использованием логического символа «ровно». На панели Boolean он выделен жирным шрифтом (см. рис. 2)
Рис. 2. Панели Boolean и Calculator
После уравнения вводится функция Find(x) (где х — переменная). Это функция, которая возвращает результат. Значение функции Find(x) можно присвоить какой-либо переменной с помощью символа «:=» и использовать ее далее в расчетах
Для получения результата, после Find(x) следует поставить символ «→» либо «=» из панели Evaluation (см. рис. 3). Причем, если вы используете символ «→«, то mathcad определит все корни уравнения и сформирует матрицу результатов. Но если вы используете символ «=«, то mathcad выведет единственный корень, который был наиболее близок к начальному приближению. Так что, если вы не знаете сколько корней имеет уравнение, то лучше использовать стрелочку
Рис. 3. Панель «Evaluation»
В зависимости от сложности уравнения через определенное время MathCad выведет результат. На рис.4 можно рассмотреть синтаксис и различие результатов выводимых mathcad. Обратите внимание, что выводимые результаты одного и того же уравнения различны
Рис. 4. Результат численного решения уравнения
Mathcad позволяет решать уравния в символьном виде. Например, если мы заменим все числовые константы на неизвестные параметры и решим уравнение относительно x, то результат выведется в символьном виде (см. рис. 5). Причем, обратите внимание, что в данном случае нам не нужно вводить начальное приближение и мы должны использовать символ «→» для вывода результата
Рис. 5. Результат символьного решения уравнения
Использование метода Solve:
Этот метод отличается от выше рассмотренного синтаксисом. На свободном поле вводим уравнение с использованием логического символа «ровно» из панели Boolean. После ввода уравнения, не смещая курсор ввода, на панели Symbolic нажимаем кнопку solve (см. рис. 6)
Рис. 6. Панель Symbolic
Затем ставим запятую и вводим переменную, относительно которой нужно решить уравнение (в нашем случае это x). Нажимаем Enter на клавиатуре и смотрим результат (см. рис. 7)
Рис. 7. Результат решения уравнения методом Solve
Обратите внимание, что метод подходит как для численного так и для символьного представления результатов
Как показывает моя личная инженерная практика, иногда не удается решить уравнения с помощью Given — Find, но получается в Solve. При этом, к сожалению, метод Solve не очень удобен для далнейшего использования результатов решения уравнения

Donec eget ex magna. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque venenatis dolor imperdiet dolor mattis sagittis. Praesent rutrum sem diam, vitae egestas enim auctor sit amet. Pellentesque leo mauris, consectetur id ipsum sit amet, fergiat. Pellentesque in mi eu massa lacinia malesuada et a elit. Donec urna ex, lacinia in purus ac, pretium pulvinar mauris. Curabitur sapien risus, commodo eget turpis at, elementum convallis elit. Pellentesque enim turpis, hendrerit tristique.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis dapibus rutrum facilisis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam tristique libero eu nibh porttitor fermentum. Nullam venenatis erat id vehicula viverra. Nunc ultrices eros ut ultricies condimentum. Mauris risus lacus, blandit sit amet venenatis non, bibendum vitae dolor. Nunc lorem mauris, fringilla in aliquam at, euismod in lectus. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In non lorem sit amet elit placerat maximus. Pellentesque aliquam maximus risus, vel venenatis mauris vehicula hendrerit.
Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque venenatis dolor imperdiet dolor mattis sagittis. Praesent rutrum sem diam, vitae egestas enim auctor sit amet. Pellentesque leo mauris, consectetur id ipsum sit amet, fersapien risus, commodo eget turpis at, elementum convallis elit. Pellentesque enim turpis, hendrerit tristique lorem ipsum dolor.
Форма обратной связи
Поделиться
Статистика
- © student-engineer.pro :: Semen Kuptcov
Решение нелинейных уравнений в Matlab

Доброго времени суток. В этой статье мы разберем решение простых нелинейных уравнений с помощью средств Matlab. Посмотрим в действии как стандартные функции, так и сами запрограммируем три распространенных метода для решения нелинейных уравнений.
Общая информация
- Метод перебора
- Метод простых итераций
- Метод половинного деления
Рассмотрим коротко их алгоритмы и применим для решения конкретной задачи.
Стандартные функции Matlab
Для решения нелинейных уравнений в Matlab есть функция fzero. Она принимает в качестве аргументов саму функцию, которую решаем, и отрезок, на котором происходит поиск корней нелинейного уравнения.
И сразу же разберем пример:
Решить нелинейное уравнение x = exp(-x), предварительно определив интервалы, на которых существуют решения уравнения.
Итак, для начала следует привести уравнение к нужному виду: x — exp(-x) = 0 , а затем определить интервалы, в которых будем искать решение уравнения. Методов для определения интервалов множество, но так как пример достаточно прост мы воспользуемся графическим методом.
x = -4.0 : 0.001 : 4.0; y = x - exp(-x); plot(x,y); grid on;

Здесь задали примерные границы по оси x, чтобы можно было построить график и посмотреть как ведет себя функция. Вот график:
Из графика видно, что на отрезке [0;1] есть корень уравнения (там, где y = 0), соответственно в дальнейшем будем использовать этот интервал. Чем точнее выбран интервал, тем быстрее метод придет к решению уравнения, а для сложных уравнений правильный выбор интервала определяет погрешность, с которой будет получен ответ.
x0 = fzero('(x - exp(-x))', [0.0 1.0]); x0 = 0.5671
С помощью стандартной функции Matlab находим корень нелинейного уравнения и выводим. Теперь для проверки отобразим все это графически:
plot(x,y); grid on; hold on; plot(x0,0,'r*');

Как вы видите, все достаточно точно просчиталось. Теперь мы исследуем эту же функцию с помощью других методов и сравним полученные результаты.
Метод перебора Matlab
Самый простой метод, который заключается в том, что сначала задается какое то приближение x (желательно слева от предполагаемого корня) и значение шага h. Затем, пока выполняется условие f(x) * f(x + h) > 0, значение x увеличивается на значение шага x = x + h. Как только условие перестало выполняться — это значит, что решение нелинейного уравнения находится на интервале [x; x + h].
Теперь реализуем метод перебора в Matlab:
f = inline('x - exp(-x)'); h = 0.0001; % задаем шаг x = 0.0; % начальное приближение i = 0; % счетчик итераций while (f(x)*f(x+h)) > 0 x = x + h; i = i + 1; end x % выводим решение i % и затраченное количество итераций
Лучше всего создать новый m-файл, в котором и прописать код. После вызова получаем такой вывод:
x = 0.5671 i = 5671
Функцию объявляем с помощью очень полезной команды inline, в цикле пока выполняется условие отсутствия корней (или их четного количества), прибавляем к x значение шага. Очевидно, что чем точнее начальное приближение, тем меньше итераций необходимо затратить.
Метод простых итераций Matlab
Этот метод заключается в том, что функцию преобразуют к виду: x = g(x). Эти преобразования можно сделать разными способами, в зависимости от вида начальной функции. Помимо этого следует задать интервал, в котором и будет производиться итерационный процесс, а также начальное приближение. Сам процесс строится по схеме xn= g(xn-1). То есть итерационно проходим от предыдущего значения к последующему.
Процесс заканчивается как только выполнится условие: , то есть, как только будет достигнута заданная точность. И сразу же разберем реализацию метода простых итераций в Matlab для примера, который был приведен выше.
f = inline('x - exp(-x)'); x0 = 0.0; % начальное приближение eps = 0.00001; % точность N = 100; % количество итераций, чтобы не было зацикливаний g = inline('exp(-x)'); x1 = g(x0); % первое значение for i = 1 : N % делаем максимум 100 итераций if abs(x1 - x0) eps break end x0 = x1; x1 = g(x0); end x1 i
Здесь должно быть все понятно, кроме одного: зачем задавать число итераций? Это нужно для того, чтобы программа не зацикливалась и не выполняла ненужные итерации, а также потому что не всегда программа может просчитать решение с нужной точностью — поэтому следует ограничивать число итераций.
А вот и вывод программы:
x1 = 0.5671 i = 22
Очевидно, что метод простых итераций работает гораздо быстрее и получает точное решение.
Метод половинного деления Matlab
Метод достаточно прост: существует отрезок поиска решения [a;b], сначала находят значение функции в точке середины c, где c = (a+b)/2. Затем сравнивают знаки f(a) и f(c). Если знаки разные — то решение находится на отрезке [a;c], если нет — то решение находится на отрезке [c;b]. Таким образом мы сократили область в 2 раза. Такое сокращение происходит и дальше, пока не достигнем заданной точности.
Перейдем к реализации метода в Matlab:
f = inline('x - exp(-x)'); eps = 0.00001; a = 0.0; b = 1.0; i = 0; while abs(a - b) > eps c = (a + b) / 2; if ((f(c) * f(a)) < 0) b = c; else a = c; end i = i + 1; end c i
Все самое важное происходит в цикле: последовательно сокращаем область нахождения решения, пока не будет достигнута заданная точность.
Вот что получилось в выводе:
c = 0.5671 i = 17
Этот метод хорошо работает, когда правильно определен интервал, на котором находится решение. Тем не менее, метод простых итераций считается наиболее точным и быстрым.
Заключение
Сегодня мы рассмотрели решение нелинейных уравнений в Matlab. Теперь нам известны методы перебора, половинного деления, простых итераций. А также, когда нам не важно реализация метода, то можно использовать стандартную функцию в Matlab.
На этом все — спасибо за внимание. В следующей статье мы разберем решение систем нелинейных уравнений в matlab.
