Символьная математическая Toolbox™ предлагает как числовые, так и символьные решатели уравнений. Сравнение числовых и символьных решателей см. в разделе Выбор числового или символьного решателя. Уравнение или система уравнений может иметь несколько решений. Чтобы найти эти решения численно, используйте функцию vpasolve. Для полиномиальных уравнений: vpasolve возвращает все решения. Для неполиномиальных уравнений vpasolve возвращает первое найденное решение. В этих примерах показано, как использовать vpasolve найти решения как полиномиальных, так и неполиномиальных уравнений, и как получить эти решения с произвольной точностью.
Использовать vpasolve найти все решения функции 3x3-8.
syms f(x)
f(x) = 6*x^7-2*x^6+3*x^3-8;
sol = vpasolve(f)sol =
vpasolve возвращает семь корней функции, как и ожидалось, поскольку функция является многочленом степени семь.
График функции cos (2x) показывает периодические нули с увеличением откосов в нулевых точках по мере увеличения x.
syms x h = fplot(exp(x/7)*cos(2*x),[-2 25]); grid on

Использовать vpasolve чтобы найти ноль функции f. Обратите внимание, что vpasolve возвращает только одно решение неполиномиального уравнения, даже если существует несколько решений. При повторных вызовах, vpasolve возвращает тот же результат.
f = exp(x/7)*cos(2*x); for k = 1:3 vpasolve(f,x) end
ans =
ans =
ans =
Чтобы найти несколько решений, задайте опцию 'Random' кому true. Это делает vpasolve случайным образом выбирайте начальные точки. Сведения об алгоритме, выбирающем случайные начальные точки, см. в разделе Алгоритмы на vpasolve страница.
for k = 1:3 vpasolve(f,x,'Random',true) end
ans =
ans =
ans =
Чтобы найти ноль, близкий к 10, установите начальную точку на10.
vpasolve(f,x,10)
ans =
Чтобы найти ноль, близкий к 1000, установите начальную точку на1000.
vpasolve(f,x,1000)
ans =
Чтобы найти ноль в диапазона, задайте для диапазона поиска значение [15 25].
vpasolve(f,x,[15 25])
ans =
Поиск нескольких нулей в диапазоне [15 25], звонить нельзя vpasolve многократно, потому что он возвращает один и тот же результат для каждого вызова, как показано ранее. Вместо этого задайте диапазон поиска и задайте 'Random' кому true.
for k = 1:3 vpasolve(f,x,[15 25],'Random',true) end
ans =
ans =
ans =
Поскольку 'Random' выбирает начальные точки случайным образом, то же решение может быть найдено при последовательных вызовах.
Создание функции findzeros систематически находить все нули для f в заданном диапазоне поиска в пределах заданного допуска ошибки. Функция начинается с диапазона входного поиска и вызовов vpasolve чтобы найти ноль. Затем он разбивает диапазон поиска на два вокруг нулевого значения и рекурсивно вызывает себя с новыми диапазонами поиска в качестве входных данных, чтобы найти больше нулей.
Здесь функция описывается в разделе.
Объявите функцию с тремя входами и одним выходом. Первый вход - это функция, второй вход - это диапазон, а дополнительный третий вход позволяет указать ошибку между нулем и более высокой и нижней границами, генерируемыми из него.
function sol = findzeros(f,range,err)
Если дополнительный аргумент для допуска ошибок не указан, findzeros наборы err кому 0.001.
if nargin < 2 err = 1e-3; end
Найти ноль в диапазоне поиска с помощью vpasolve.
sol = vpasolve(f,range);
Если vpasolve не находит ноль, выход.
if(isempty(sol)) return
Если vpasolve находит ноль, разбивает диапазон поиска на два диапазона поиска выше и ниже нуля.
else
lowLimit = sol-err;
highLimit = sol+err;
Звонить findzeros с нижним диапазоном поиска. Если findzeros возвращает нули, копирует значения в массив решения и сортирует их.
temp = findzeros(f,[range(1) lowLimit],1); if ~isempty(temp) sol = sort([sol temp]); end
Звонить findzeros с более высоким диапазоном поиска. Если findzeros возвращает нули, копирует значения в массив решения и сортирует их.
temp = findzeros(f,[highLimit range(2)],1); if ~isempty(temp) sol = sort([sol temp]); end return end end
Вся функция findzeros является следующим. Сохранить эту функцию как findzeros.m в текущей папке.
function sol = findzeros(f,range,err) if nargin < 3 err = 1e-3; end sol = vpasolve(f,range); if(isempty(sol)) return else lowLimit = sol-err; highLimit = sol+err; temp = findzeros(f,[range(1) lowLimit],1); if ~isempty(temp) sol = sort([sol temp]); end temp = findzeros(f,[highLimit range(2)],1); if ~isempty(temp) sol = sort([sol temp]); end return end end
Звонить findzeros с диапазоном поиска [15 25] найти все нули в этом диапазоне для f(x) = exp(x/7)*cos(2*x), в пределах допуска по умолчанию.
syms f(x)
f(x) = exp(x/7)*cos(2*x);
sol = findzeros(f,[15 25])'sol =
Использовать digits для установки точности решений, возвращаемых vpasolve. По умолчанию vpasolve возвращает решения с точностью до 32 значимых фигур.
f = exp(x/7)*cos(2*x); vpasolve(f)
ans =
Использовать digits повысить точность до 64 значимых цифр. При изменении digitsубедитесь, что текущее значение сохранено для восстановления.
digitsOld = digits; digits(64) vpasolve(f)
ans =
Затем измените точность решений на 16 значимых цифр.
digits(16)
Рассмотрим следующую систему уравнений.
y2-0.1x2yx + y-2.7 = 0
График уравнений для и показывает, что три поверхности пересекаются в двух точках. Для лучшей визуализации графика используйте view. Для масштабирования значений карты цветов используйте caxis.
syms x y z eqn1 = z == 10*(cos(x) + cos(y)); eqn2 = z == x+y^2-0.1*x^2*y; eqn3 = x+y-2.7 == 0; equations = [eqn1 eqn2 eqn3]; fimplicit3(equations) axis([0 2.5 0 2.5 -20 10]) title('System of Multivariate Equations') view(69, 28) caxis([-15 10])

Использовать vpasolve для поиска точки пересечения поверхностей. Функция vpasolve возвращает структуру. Для доступа к x-, y-, и z-значения решения, индексация в структуру.
sol = vpasolve(equations); [sol.x sol.y sol.z]
ans =
Для поиска области пространства решения укажите диапазоны поиска переменных. Если указаны диапазоны и , то vpasolve функция выполняет поиск в ограниченной области, показанной на рисунке.

Использовать vpasolve чтобы найти решение для этого диапазона поиска. Чтобы опустить диапазон поиска для , задайте для третьего диапазона поиска значение [NaN NaN].
vars = [x y z]; range = [0 1.5; 1.5 2.5; NaN NaN]; sol = vpasolve(equations, vars, range); [sol.x sol.y sol.z]
ans =
Чтобы найти несколько решений, установите 'Random' опция для true. Это делает vpasolve использовать случайные начальные точки для последовательных прогонов. 'Random' можно использовать в сочетании с диапазонами поиска для создания vpasolve использовать случайные начальные точки в пределах диапазона поиска. Поскольку 'Random' выбирает начальные точки случайным образом, то же решение может быть найдено при последовательных вызовах. Звонить vpasolve многократно, чтобы обеспечить поиск обоих решений.
clear sol range = [0 3; 0 3; NaN NaN]; for k = 1:5 temp = vpasolve(equations,vars,range,'Random',true); sol(k,1) = temp.x; sol(k,2) = temp.y; sol(k,3) = temp.z; end sol
sol =
Постройте график уравнений. Наложение решений в виде графика рассеяния точек желтым цветом X маркеры с использованием scatter3. Чтобы лучше визуализировать график, сделайте две поверхности прозрачными с помощью alpha. Масштабирование карты цветов до значений графика с помощью caxisи изменить перспективу с помощью view.
vpasolve находит решения на пересечении поверхностей, образованных уравнениями, как показано на рисунке.
clf ax = axes; h = fimplicit3(equations); h(2).FaceAlpha = 0; h(3).FaceAlpha = 0; axis([0 2.5 0 2.5 -20 10]) hold on scatter3(sol(:,1),sol(:,2),sol(:,3),600,'yellow','X','LineWidth',2) title('Randomly Found Solutions in Specified Search Range') cz = ax.Children; caxis([0 20]) view(69,28) hold off

Наконец, восстановить старое значение digits для дальнейших расчетов.
digits(digitsOld)