vpasolve

Решите уравнения численно

Синтаксис

S = vpasolve(eqn)
S = vpasolve(eqn,var)
S = vpasolve(eqn,var,init_guess)
Y = vpasolve(eqns)
Y = vpasolve(eqns,vars)
Y = vpasolve(eqns,vars,init_guess)
[y1,...,yN] = vpasolve(eqns)
[y1,...,yN] = vpasolve(eqns,vars)
[y1,...,yN] = vpasolve(eqns,vars,init_guess)
___ = vpasolve(___,'Random',true)

Описание

пример

S = vpasolve(eqn) численно решает уравнение eqn для переменной, определенной symvar.

пример

S = vpasolve(eqn,var) численно решает уравнение eqn для переменной, заданной var.

пример

S = vpasolve(eqn,var,init_guess) численно решает уравнение eqn для переменной, заданной var с помощью отправной точки или поисковой области значений, заданной в init_guess. Если вы не задаете var, vpasolve решает для переменных, определенных symvar.

Y = vpasolve(eqns) численно решает систему уравнений eqns для переменных, определенных symvar. Этот синтаксис возвращает Y как массив структур. Можно получить доступ к решениям путем индексации в массив.

пример

Y = vpasolve(eqns,vars) численно решает систему уравнений eqns для переменных, заданных vars. Этот синтаксис возвращает массив структур, который содержит решения. Поля в массиве структур соответствуют переменным, заданным vars.

Y = vpasolve(eqns,vars,init_guess) численно решает систему уравнений eqns для переменных vars с помощью начальных значений или поисковой области значений init_guess.

[y1,...,yN] = vpasolve(eqns) численно решает систему уравнений eqns для переменных, определенных symvar. Этот синтаксис присваивает решения переменных y1,...,yN.

пример

[y1,...,yN] = vpasolve(eqns,vars) численно решает систему уравнений eqns для переменных, заданных vars.

[y1,...,yN] = vpasolve(eqns,vars,init_guess) численно решает систему уравнений eqns для переменных, заданных vars с помощью начальных значений или поисковой области значений init_guess.

пример

___ = vpasolve(___,'Random',true) использует случайную отправную точку для нахождения решений. Используйте этот вход, чтобы не возвращать то же решение неоднократно для неполиномиальных уравнений. Если вы задаете отправные точки для всех переменных, установка 'Random' к true не имеет никакого эффекта.

Примеры

Решите полиномиальное уравнение

Для полиномиальных уравнений vpasolve возвращает все решения:

syms x
vpasolve(4*x^4 + 3*x^3 + 2*x^2 + x + 5 == 0, x)
ans =
 - 0.88011377126068169817875190457835 + 0.76331583387715452512978468102263i
 - 0.88011377126068169817875190457835 - 0.76331583387715452512978468102263i
   0.50511377126068169817875190457835 + 0.81598965068946312853227067890656i
   0.50511377126068169817875190457835 - 0.81598965068946312853227067890656i

Если vpasolve возвращает пустой объект, то никакое решение не было найдено.

eqns = [3*x+2, 3*x+1];
vpasolve(eqns, x)
ans =
Empty sym: 0-by-1

Решите неполиномиальное уравнение

Для неполиномиальных уравнений vpasolve возвращает первое решение, которое он находит:

syms x
vpasolve(sin(x^2) == 1/2, x)
ans =
-226.94447241941511682716953887638

Присвойте решения массива структур

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

syms x y
S = vpasolve([x^3 + 2*x == y, y^2 == x], [x, y])
S = 
  struct with fields:

    x: [6×1 sym]
    y: [6×1 sym]

Отобразите решения путем доступа к элементам массива структур S:

S.x
ans =
                                         0.2365742942773341617614871521768
                                                                         0
 - 0.28124065338711968666197895499453 + 1.2348724236470142074859894531946i
 - 0.28124065338711968666197895499453 - 1.2348724236470142074859894531946i
   0.16295350624845260578123537890613 - 1.6151544650555366917886585417926i
   0.16295350624845260578123537890613 + 1.6151544650555366917886585417926i
S.y
ans =
                                         0.48638903593454300001655725369801
                                                                          0
   0.70187356885586188630668751791218 + 0.87969719792982402287026727381769i
   0.70187356885586188630668751791218 - 0.87969719792982402287026727381769i
 - 0.94506808682313338631496614476119 + 0.85451751443904587692179191887616i
 - 0.94506808682313338631496614476119 - 0.85451751443904587692179191887616i

Присвойте решения переменных при решении системы уравнений

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

syms x y
[sol_x, sol_y] = vpasolve([x*sin(10*x) == y^3, y^2 == exp(-2*x/3)], [x, y])
sol_x =
88.90707209659114864849280774681
 
sol_y =
0.00000000000013470479710676694388973703681918

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

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

Постройте левые и правые стороны уравнения 200sin(x)=x3-1.

syms x
eqnLeft = 200*sin(x); 
eqnRight = x^3 - 1;
fplot([eqnLeft eqnRight])
title([texlabel(eqnLeft) ' = ' texlabel(eqnRight)])

Это уравнение имеет три решения. Если вы не задаете исходное предположение (нулевое приближение), vpasolve возвращает первое решение, которое это находит:

vpasolve(200*sin(x) == x^3 - 1, x)
ans =
-0.0050000214585835715725440675982988

Найдите одно из других решений путем определения начальной точки, которая является близко к тому решению:

vpasolve(200*sin(x) == x^3 - 1, x, -4)
ans =
-3.0009954677086430679926572924945
vpasolve(200*sin(x) == x^3 - 1, x, 3)
ans =
3.0098746383859522384063444361906

Задайте области значений для решений

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

syms x
vpasolve(x^8 - x^2 == 3, x)
ans =
                                         -1.2052497163799060695888397264341
                                          1.2052497163799060695888397264341
 - 0.77061431370803029127495426747428 + 0.85915207603993818859321142757163i
 - 0.77061431370803029127495426747428 - 0.85915207603993818859321142757164i
                                        -1.0789046020338265308047436284205i
                                         1.0789046020338265308047436284205i
   0.77061431370803029127495426747428 + 0.85915207603993818859321142757164i
   0.77061431370803029127495426747428 - 0.85915207603993818859321142757163i

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

assume(x, 'real')
vpasolve(x^8 - x^2 == 3, x)
ans =
                                         -1.2052497163799060695888397264341
                                          1.2052497163799060695888397264341
 - 0.77061431370803029127495426747428 + 0.85915207603993818859321142757163i
 - 0.77061431370803029127495426747428 - 0.85915207603993818859321142757164i
                                        -1.0789046020338265308047436284205i
                                         1.0789046020338265308047436284205i
   0.77061431370803029127495426747428 + 0.85915207603993818859321142757164i
   0.77061431370803029127495426747428 - 0.85915207603993818859321142757163i

Задайте поисковую область значений, чтобы ограничить возвращенные результаты конкретными областями значений. Например, чтобы возвратить только действительные решения этого уравнения, задайте поисковый интервал как [-Inf Inf]:

vpasolve(x^8 - x^2 == 3, x, [-Inf Inf])
ans =
 -1.2052497163799060695888397264341
  1.2052497163799060695888397264341

Возвратите только неотрицательные решения:

vpasolve(x^8 - x^2 == 3, x, [0 Inf])
ans =
1.2052497163799060695888397264341

Поисковая область значений может содержать комплексные числа. В этом случае vpasolve использует прямоугольную область поиска в комплексной плоскости:

vpasolve(x^8 - x^2 == 3, x, [-1, 1 + i])
ans =
 - 0.77061431370803029127495426747428 + 0.85915207603993818859321142757164i
   0.77061431370803029127495426747428 + 0.85915207603993818859321142757164i

Найдите несколько решений для неполиномиального уравнения

По умолчанию vpasolve возвращает то же решение на каждом вызове. Чтобы найти больше чем одно решение для неполиномиальных уравнений, установите 'Random' на true. Это заставляет vpasolve использовать случайное начальное значение, которое может привести к различным решениям на последовательных вызовах.

Если Random не задан, vpasolve возвращает то же решение на каждом вызове.

syms x 
f = x-tan(x);
for n = 1:3 
  vpasolve(f,x) 
end
ans =
0
ans =
0
ans =
0

Когда 'Random' установлен в true, vpasolve возвращает отличное решение на каждом вызове.

syms x 
f = x-tan(x);
for n = 1:3 
  vpasolve(f,x,'Random',true) 
end
ans =
 -227.76107684764829218924973598808
 ans =
 102.09196646490764333652956578441
 ans =
 61.244730260374400372753016364097

random может использоваться в сочетании с поисковой областью значений:

vpasolve(f,x,[10 12],'Random',true)
ans =
10.904121659428899827148702790189

Входные параметры

свернуть все

Уравнение, чтобы решить, заданный как символьное уравнение или символьное выражение. Символьное уравнение определено оператором отношения ==. Если eqn является символьным выражением (без правой стороны), решатель принимает, что правая сторона 0 и решает уравнение eqn == 0.

Переменная, чтобы решить уравнение для, заданный как символьная переменная. Если var не задан, symvar определяет переменные.

Система уравнений или выражения, чтобы быть решают, заданный как символьный вектор, матрица или массив N-D уравнений или выражений. Эти уравнения или выражения могут также быть разделены запятыми. Если уравнение является символьным выражением (без правой стороны), решатель принимает, что правая сторона того уравнения 0.

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

Исходное предположение для решения, заданного как числовое значение, вектор или матрица с двумя столбцами.

Если init_guess является номером или, в случае многомерных уравнений, вектора чисел, то числовой решатель использует его в качестве отправной точки. Если init_guess задан как скаляр, в то время как система уравнений многомерна, то числовой решатель использует скалярное значение в качестве отправной точки для всех переменных.

Если init_guess является матрицей с двумя столбцами, то две записи строк задают границы поисковой области значений для соответствующих переменных. Чтобы задать отправную точку в матрице поисковых областей значений, задайте оба столбца как значение отправной точки.

Чтобы не использовать поисковую область значений для переменной, установите поисковую область значений для той переменной к [NaN, NaN] в init_guess. Все другое использование NaN в init_guess будет ошибка.

По умолчанию vpasolve использует свой собственный внутренний выбор для отправных точек и поисковых областей значений.

Выходные аргументы

свернуть все

Решения одномерного уравнения, возвращенного как символьное значение или символьный массив. Размер символьного массива соответствует количеству решений.

Решения системы уравнений, возвращенной как массив структур. Количество полей в массиве структур соответствует количеству переменных, которые будут решены для.

Переменные, которые являются присвоенными решениями системы уравнений, возвратились как массив числовых или символьных переменных. Количество выходных переменных или символьных массивов должно равняться количеству переменных, которые будут решены для. Если вы явным образом задаете независимые переменные vars, то решатель использует тот же порядок возвратить решения. Если вы не задаете vars, независимые переменные видов тулбокса в алфавитном порядке, и затем присваивает решения для этих переменных к выходным переменным или символьным массивам.

Советы

  • Если vpasolve возвращает пустой объект, то никакое решение не было найдено.

  • vpasolve возвращает все решения только для полиномиальных уравнений. Для неполиномиальных уравнений нет никакого общего метода нахождения всех решений. Когда вы ищете числовые решения неполиномиального уравнения или системы, которая имеет несколько решений, затем, по умолчанию, vpasolve возвращает только одно решение, если таковые имеются. Чтобы найти больше, чем всего одно решение, установите 'Random' на истину. Теперь, вызов vpasolve неоднократно может возвращать несколько различных решений.

  • Когда вы решаете систему, где существует недостаточно уравнений, чтобы определить все переменные исключительно, поведение поведения vpasolve зависит от того, является ли система полиномом или неполиномом. Если полином, vpasolve возвращает все решения путем представления произвольного параметра. Если неполином, одно числовое решение возвращено, если это существует.

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

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

  • Если init_guess задает поисковую область значений [a,b] и значения, a,b является комплексными числами, то vpasolve ищет решения в прямоугольной области поиска в комплексной плоскости. Здесь, a задает нижний левый угол прямоугольной области поиска, и b задает верхний правый угол той области.

  • y1,...,yN выходных переменных не задает переменные, для которых vpasolve решает уравнения или системы. Если y1,...,yN является переменными, которые появляются в eqns, который не гарантирует, что vpasolve(eqns) присвоит решения y1,...,yN с помощью правильного порядка. Таким образом, для вызова [a,b] = vpasolve(eqns), вы можете получить решения для a, присвоенного b и наоборот.

    Чтобы гарантировать порядок возвращенных решений, задайте переменные vars. Например, вызов [b,a] = vpasolve(eqns,b,a) присваивает решения для a, присвоенного a и решениям для b, присвоенного b.

  • Поместите уравнения и выражения слева от списка аргументов и переменные направо. проверки vpasolve на переменные, запускающиеся справа, и при достижении первого уравнения или выражения, принимают, что все налево - уравнение или выражение.

  • Если возможно, решите уравнения символически с помощью solve, и затем аппроксимируйте полученные символьные результаты численно с помощью vpa. Используя этот подход, вы получаете числовые приближения всех решений, найденных символьным решателем. Используя символьный решатель и постобработку его результатов требует большего количества времени, чем использование числовых методов непосредственно. Это может значительно уменьшить производительность.

Алгоритмы

  • Когда вы устанавливаете 'Random' на true и задаете поисковую область значений для, переменные, случайные отправные точки в поисковой области значений выбраны с помощью внутреннего генератора случайных чисел. Распределение отправных точек в конечных поисковых областях значений универсально.

  • Когда вы устанавливаете random на true и не задаете поисковую область значений для, переменные, случайные отправные точки сгенерированы с помощью распределения Коши с полушириной 100. Это означает, что отправные точки действительны оцененный и имеют большое распространение значений на повторных вызовах.

Смотрите также

| | | | | |

Представленный в R2012b