exponenta event banner

vpasolve

Численное решение уравнений

Описание

пример

S = vpasolve(eqn,var) численно решает уравнение eqn для переменной var. Если не указать var, vpasolve решает для переменной по умолчанию, определяемой symvar. Например, vpasolve(x + 1 == 2, x) численно решает уравнение x + 1 = 2 для x.

пример

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

пример

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

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

пример

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

пример

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

пример

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

Примеры

свернуть все

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

syms x
S = vpasolve(2*x^4 + 3*x^3 - 4*x^2 - 3*x + 2 == 0, x)
S = 

(-2.0-1.00.51.0)[-vpa('2.0'); -vpa('1.0'); vpa('0.5'); vpa('1.0')]

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

S = vpasolve(sin(x) == 1/2, x)
S = 0.52359877559829887307710723054658vpa('0.52359877559829887307710723054658')

Найдите несколько решений уравнения 200sin (x) = x3-1, указав начальные догадки при использованииvpasolve.

Постройте график левой и правой частей уравнения.

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

Figure contains an axes. The axes with title {200} {sin}({x}) = {x}^{3} - {1} contains 2 objects of type functionline.

График показывает, что уравнение имеет три решения. Если начальное предположение не указано, vpasolve возвращает первое найденное решение.

S1 = vpasolve(eqnLeft == eqnRight, x)
S1 = -0.0050000214585835715725440675982988-vpa('0.0050000214585835715725440675982988')

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

S2 = vpasolve(eqnLeft == eqnRight, x, -3)
S2 = -3.0009954677086430679926572924945-vpa('3.0009954677086430679926572924945')
S3 = vpasolve(eqnLeft == eqnRight, x, 4)
S3 = 3.0098746383859522384063444361906vpa('3.0098746383859522384063444361906')

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

syms u v
Y = vpasolve([v^3 + 2*u == v, v^2 == u], [u,v])
Y = struct with fields:
    u: [3x1 sym]
    v: [3x1 sym]

Просмотр решений путем доступа к полям структурного массива Y.

uSol = Y.u
uSol = 

(05.82842712474619009760337744841940.1715728752538099023966225515806)[sym(0); vpa('5.8284271247461900976033774484194'); vpa('0.1715728752538099023966225515806')]

vSol = Y.v
vSol = 

(0-2.41421356237309504880168872420970.4142135623730950488016887242097)[sym(0); -vpa('2.4142135623730950488016887242097'); vpa('0.4142135623730950488016887242097')]

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

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

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

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.90707209659114864849280774681vpa('88.90707209659114864849280774681')
sol_y = 0.00000000000013470479710676694388973703681918vpa('0.00000000000013470479710676694388973703681918')

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

syms x
S = vpasolve(x^6 - x^2 == 3, x)
S = 

(-1.29294233500847243691965504363821.2929423350084724369196550436382-0.50188125716943915856832436499602-1.0429452224956770037495194222175i-0.50188125716943915856832436499602+1.0429452224956770037495194222175i0.50188125716943915856832436499602-1.0429452224956770037495194222175i0.50188125716943915856832436499602+1.0429452224956770037495194222175i)[-vpa('1.2929423350084724369196550436382'); vpa('1.2929423350084724369196550436382'); - vpa('0.50188125716943915856832436499602') - vpa('1.0429452224956770037495194222175i'); - vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') - vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i')]

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

assume(x,'real')
S = vpasolve(x^6 - x^2 == 3, x)
S = 

(-1.29294233500847243691965504363821.2929423350084724369196550436382-0.50188125716943915856832436499602-1.0429452224956770037495194222175i-0.50188125716943915856832436499602+1.0429452224956770037495194222175i0.50188125716943915856832436499602-1.0429452224956770037495194222175i0.50188125716943915856832436499602+1.0429452224956770037495194222175i)[-vpa('1.2929423350084724369196550436382'); vpa('1.2929423350084724369196550436382'); - vpa('0.50188125716943915856832436499602') - vpa('1.0429452224956770037495194222175i'); - vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') - vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i')]

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

S = vpasolve(x^6 - x^2 == 3, x, [-Inf Inf])
S = 

(-1.29294233500847243691965504363821.2929423350084724369196550436382)[-vpa('1.2929423350084724369196550436382'); vpa('1.2929423350084724369196550436382')]

Чтобы вернуть неотрицательные решения, укажите интервал поиска как [0 Inf].

S = vpasolve(x^6 - x^2 == 3, x, [0 Inf])
S = 1.2929423350084724369196550436382vpa('1.2929423350084724369196550436382')

Диапазон поиска может также содержать комплексные числа, такие как [-1, 1+2i]. В этом случае vpasolve использует прямоугольную область поиска в комплексной плоскости, где -1 задает левый нижний угол области поиска и 1+2i указывает правый верхний угол этой области.

S = vpasolve(x^6 - x^2 == 3, x, [-1 1+2i])
S = 

(-0.50188125716943915856832436499602+1.0429452224956770037495194222175i0.50188125716943915856832436499602+1.0429452224956770037495194222175i)[- vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i'); vpa('0.50188125716943915856832436499602') + vpa('1.0429452224956770037495194222175i')]

Найдите решение для следующей системы уравнений.

syms x y
eqn1 = exp(-x^2-y^2)*(x-4) - exp((-x^2-y^2)/2)*(x-2) == 0
eqn1 = 

e-x2-y2x-4-e-x22-y22x-2=0exp((- x^2 - y^2))*(x - 4) - exp((- x^2/2 - y^2/2))*(x - 2) == 0

eqn2 = exp(-x^2-y^2)*(y-2) - exp((-x^2-y^2)/2)*(y-4) == 0
eqn2 = 

e-x2-y2y-2-e-x22-y22y-4=0exp((- x^2 - y^2))*(y - 2) - exp((- x^2/2 - y^2/2))*(y - 4) == 0

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

[solX, solY] = vpasolve([eqn1 eqn2],[x y])
 
solX =
 
Empty sym: 0-by-1
 
 
solY =
 
Empty sym: 0-by-1
 

Теперь укажите начальные догадки x = 2 и y = 4. vpasolve возвращает решения, близкие к начальным предположениям.

[solX, solY] = vpasolve([eqn1 eqn2],[x y],[2; 4])
solX = 1.9999092125057125429174334656647vpa('1.9999092125057125429174334656647')
solY = 4.0000907874942874570825665343353vpa('4.0000907874942874570825665343353')

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

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

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

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

for n = 1:3
    S = vpasolve(f,x,'Random',true)
end
S = -227.76107684764829218924973598808-vpa('227.76107684764829218924973598808')
S = 102.09196646490764333652956578441vpa('102.09196646490764333652956578441')
S = 61.244730260374400372753016364097vpa('61.244730260374400372753016364097')

'Random' может использоваться в сочетании с диапазоном поиска.

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

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

свернуть все

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

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

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

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

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

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

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

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

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

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

свернуть все

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

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

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

Совет

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

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

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

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

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

  • Выходные переменные 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.

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

Алгоритмы

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

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

См. также

| | | | | |

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