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.828427124746190097603774484194'); 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.042945222495670037495194222175i'); vpa ('0.50188125716943915856832436499602') + vpa ('1.042945222495670037495194222175i')]

Предположим, что вам нужны только реальные решения этого уравнения. Вы не можете использовать допущения к переменным, потому что 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.042945222495670037495194222175i'); vpa ('0.50188125716943915856832436499602') + vpa ('1.042945222495670037495194222175i')]

Укажите область значений поиска, чтобы ограничить возвращенные результаты конкретными областями значений. Для примера, чтобы вернуть только вещественные решения этого уравнения, задайте интервал поиска следующим [-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.04294522249567003749519422175i'); vpa ('0.50188125716943915856832436499602') + vpa ('1.042945222495670037495194222175i')]

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

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')

The 'Random' опция может использоваться в сочетании с областью значений поиска.

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

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

свернуть все

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

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

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

Переменные, для решения системы уравнений for, заданные как символьный вектор. Эти переменные заданы как вектор или список , разделенный запятыми. Если 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