Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
Существует два метода, чтобы получить числовые приближения решений:
Решите уравнения символически и аппроксимируйте полученные символьные результаты численно. Используя этот метод, вы получаете числовые приближения всех решений, найденных символьным решателем. Если символьному решателю не удается найти какие-либо решения, MuPAD® вызывает числовой решатель непосредственно. Для неполиномиальных уравнений числовой решатель возвращает только одно решение. Используя символьный решатель и последующую обработку его метод результатов требует большего количества времени, чем чисто числовой решатель и может значительно уменьшить производительность.
Решите уравнения с помощью числовых методов с начала. Этот метод быстрее, но для неполиномиальных уравнений числовой решатель возвращает только первое решение, которое это находит. Можно использовать опцию AllRealRoots, чтобы заставить решатель искать другие действительные корни. Даже с этой опцией, набор решения может быть неполным. Используя AllRealRoots может значительно уменьшить производительность.
Когда вы решаете уравнение символически, решатель не всегда возвращает результаты в явной форме. Например, решатель может представлять решения с помощью RootOf:
solve(x^3 + x + 1, x)
![]()
Если у вас есть символьное решение, которое вы хотите аппроксимировать численно, использовать команду float:
S := float(%)
![]()
Присвойте отдельные решения переменных путем индексации в S:
xSol := S[3]
![]()
Используйте float, чтобы аппроксимировать решения символьной системы:
float(solve([x^3 + x^2 + 2*x = y, y^2 = x^2], [x, y]))

Аппроксимируя символьные решения численно, вы получаете полный набор решений. Например, решите следующее уравнение символически:
S := solve(sin(x^2) = 1/2, x)

Предположим, вы хотите получить числовые результаты вместо выражений, содержащих PI. Команда float возвращает бесконечный набор решения:
float(S)

Чтобы постараться не получать символьные решения и возобновлять числовые методы, используйте команду numeric::solve. Если уравнение не является полиномом, числовой решатель возвращает только одно решение:
numeric::solve(sin(x^2) = 1/2, x)
![]()
Для полиномиальных уравнений числовой решатель возвращает все решения:
numeric::solve(4*x^4 + 3*x^3 + 2*x^2 + x + 5 = 0, x)
![]()
Когда названо опцией AllRealRoots, решатель не использует все комплексные корни. Например, когда вы символически решаете полиномиальное уравнение и аппроксимируете решения, вы получаете все решения:
numeric::solve(4*x^4 + 3*x^3 + 2*x^2 + x -1 = 0, x)
![]()
Чтобы ограничить набор решения действительными решениями только, используйте опцию AllRealRoots:
numeric::solve(4*x^4 + 3*x^3 + 2*x^2 + x - 1 = 0, x,
AllRealRoots)![]()
Используя numeric::solve, также можно решить систему полиномиальных уравнений:
numeric::solve([x^3 + 2*x = y, y^2 = x], [x, y])

Чтобы решить линейные системы численно, используйте команду numeric::linsolve. Например, решите следующую систему символически и численно:
linsolve([x = y - 1, x + y = 5/2], [x, y]); numeric::linsolve([x = y - 1, x + y = 5/2], [x, y])
![]()
![]()
Для неполиномиальных уравнений нет никакого общего метода нахождения всех решений численно. Когда вы решаете неполиномиальное уравнение или систему численно, и решения существуют, решатель возвращает только одно решение:
numeric::solve(sin(1/x) = x, x)
![]()
Это уравнение, очевидно, имеет больше чем одно решение:
plot(sin(1/x), x, x = -1..1)

Чтобы получить более действительные решения одного уравнения, содержащего одну переменную, вызовите числовой решатель с опцией AllRealRoots. Опция AllRealRoots не гарантирует, что решатель находит все существующие действительные корни. Например, опция помогает найти дополнительные решения для уравнения:
numeric::solve(sin(1/x) = x, x, AllRealRoots)
Warning: Problem in isolating search intervals. Some roots might be lost. [numeric::allRealRoots]

Для системы неполиномиального уравнения решатель также возвращает только одно решение. Строя уравнения, вы видите, что система имеет больше чем одно решение:
numeric::solve([sin(x) = y^2 - 1, cos(x) = y], [x, y]); plot(sin(x) = y^2 - 1, cos(x) = y)
![]()

Опция AllRealRoots не работает на системы:
numeric::solve([sin(x) = y^2 - 1, cos(x) = y], [x, y],
AllRealRoots)Error: Only one equation supported with 'AllRealRoots'. [numeric::solve]
Чтобы найти числовые приближения других решений, задайте интервалы, которые содержат решения. Можно использовать команду numeric::solve, который внутренне вызывает numeric::fsolve. Однако, чтобы ускорить ваши вычисления, вызовите numeric::fsolve непосредственно. Обратите внимание на то, что numeric::solve возвращает набор решений, и numeric::fsolve возвращает список:
numeric::solve([sin(x) = y^2 - 1, cos(x) = y],
[x = 2.5..3.5, y = -1.5..-0.5]);
numeric::fsolve([sin(x) = y^2 - 1, cos(x) = y],
[x = 4..5, y = -0.2..0.2])![]()
![]()
Опция MultiSolutions также служит, чтобы найти больше чем одно числовое приближение. Без этой опции числовой решатель ищет решение в заданном интервале и игнорирует любые решения, которые это находит за пределами интервала. Когда решатель находит первое решение в интервале, это останавливается и не ищет другие решения. Если вы используете MultiSolutions, решатель возвращает решения, найденные за пределами заданного интервала.
Если вы используете опцию MultiSolutions и не задаете интервала, числовой решатель возвращает только первое решение, которое это находит.
С опцией MultiSolutions также останавливается решатель после того, как это найдет первое решение в заданном интервале. Например, найдите несколько числовых приближений для следующей системы:
eqs := [x*sin(10*x) = y^3, y^2 = exp(-2*x/3)]: plot(x*sin(10*x) = y^3, y^2 = exp(-2*x/3))

Задайте интервал, где вы хотите искать решения. Например, считайте интервал x = 0..1, который содержит два решения:
plot(x*sin(10*x) = y^3, y^2 = exp(-2*x/3), x = 0..1, y = 0..1)

Вызовите numeric::solve или команду numeric::fsolve с опцией MultiSolutions. Оба решателя возвращают одно решение, которое принадлежит заданному интервалу и одному решению за пределами интервала:
numeric::fsolve(eqs, [x = 0..1, y = 0..1], MultiSolutions); numeric::solve(eqs, [x = 0..1, y = 0..1], MultiSolutions)
![]()
![]()
Определение интервала, который не содержит решений, может помочь вам найти больше приближений. В этом случае решатель не может найти решение в интервале и продолжает искать. Перед выходами решателя это может найти много решений вне заданного интервала:
numeric::fsolve(eqs, [x = -10..0, y = 0..1], MultiSolutions)

Если вы знаете интервал, содержащий решения полиномиального уравнения, можно значительно ускорить числовые приближения. Чтобы найти одно решение в заданном интервале, используйте команду numeric::realroot. Команда возвращает действительные решения и не использует комплексные единицы:
numeric::realroot(1/4*x^4 + x^3 + x + 1 = 0, x = -5..0)
![]()
Также можно задать интервал и искать все подынтервалы, которые могут содержать действительные корни. Команда numeric::realroots возвращает полный список таких подынтервалов:
numeric::realroots(1/4*x^4 + x^3 + x + 1 = 0, x = -5..0)
![]()
Если уравнение, которое вы решаете, является полиномом, каждый подынтервал содержит точно один корень. Для неполиномиальных уравнений numeric::realroots может возвратить подынтервалы, которые не содержат корней. numeric::realroots гарантирует, что поисковый интервал не содержит действительных корней вне возвращенных подынтервалов.
Нет никакого общего способа решить произвольную секунду - или обыкновенное дифференциальное уравнение (ODE) высшего порядка. Часто, такое уравнение не имеет символьного решения. В некоторых случаях решение существует, но оно может быть представлено только специальными функциями. Например, решение следующего ОДУ второго порядка включает функцию ошибок erf:
o:=ode({y''(t) = t*y'(t), y(0) = 0, y'(0) = 1/3}, y(t)):
ode::solve(o)
Предположим, вам не нужно точное символьное решение, но вы хотите аппроксимировать решение для нескольких значений параметра t. Для числовых приближений решений ОДУ MuPAD обеспечивает две функции:
numeric::odesolve возвращает числовое приближение решения в конкретной точке.
numeric::odesolve2 возвращает функцию, представляющую числовое приближение решения.
Обе функции принимают или ОДУ первого порядка или систему ОДУ первого порядка. Чтобы решить уравнение высшего порядка, преобразуйте его в систему уравнений первого порядка. Например, представляйте ОДУ второго порядка, который вы решили символически как система двух уравнений первого порядка
:. вектором решения для этой системы является Y = [y, z].
Функциональный numeric::odesolve требует, чтобы система ОДУ первого порядка (динамическая система) была представлена процедурой:
f := proc(t, Y) begin [Y[2], t*Y[2]] end_proc
![]()
Второй параметр numeric::odesolve является областью значений, в которой вы хотите решить ОДУ. Третий параметр является списком начальных условий (
). Аппроксимируйте решения y (t) для t = 1, t = 3, и
:
numeric::odesolve(f, 0..1, [0, 1/3]); numeric::odesolve(f, 0..3, [0, 1/3]); numeric::odesolve(f, 0..1/127, [0, 1/3])
![]()
![]()
![]()
MuPAD также предлагает альтернативный способ сгенерировать параметры для ОДУ числовые решатели:
Задайте свою задачу с начальными значениями как список или набор:
IVP := {y''(t) = t*y'(t), y(0) = 0, y'(0) = 1/3}:Задайте набор полей, по которым вы хотите получить решение:
fields := [y(t), y'(t)]:
Преобразуйте задачу с начальными значениями и поля в процедуру, приемлемую numeric::odesolve. Функциональный numeric::ode2vectorfield генерирует необходимую процедуру:
[ODE, t0, Y0] := [numeric::ode2vectorfield(IVP, fields)]
![]()
Теперь вызовите numeric::odesolve, чтобы аппроксимировать решение в особых значениях t:
numeric::odesolve(ODE, t0..1, Y0)
![]()
Функциональный numeric::odesolve2 также требует, чтобы система ОДУ первого порядка (динамическая система) была представлена процедурой. Чтобы сгенерировать параметры для numeric::odesolve2, используйте следующие шаги:
Задайте свою задачу с начальными значениями как список или набор:
IVP := {y''(t) = t*y'(t), y(0) = 0, y'(0) = 1/3}:Задайте набор полей, по которым вы хотите получить решение:
fields := [y(t), y'(t)]:
Преобразуйте задачу с начальными значениями и поля в процедуру, приемлемую numeric::odesolve2. Функциональный numeric::ode2vectorfield генерирует необходимую процедуру:
ODE := numeric::ode2vectorfield(IVP, fields)
![]()
Теперь вызовите numeric::odesolve2, чтобы аппроксимировать решение:
numApprox := numeric::odesolve2(ODE)
![]()
Используя функцию, сгенерированную numeric::odesolve2, найдите числовое приближение в любой точке. Например, найдите числовые решения для значений t = 1, t = 3, и
. Вы получаете те же результаты как с numeric::odesolve, но синтаксис короче:
numApprox(1); numApprox(3); numApprox(1/127)
![]()
![]()
![]()
Постройте числовое решение с помощью функции, сгенерированной numeric::odesolve2. Функциональный numApprox возвращает список [y(t), y'(t)]. При графическом выводе решения y(t) используйте скобки, чтобы извлечь первую запись списка решений:
plotfunc2d(numApprox(t)[1], t = 0..3)

Используйте numeric::odesolve2, чтобы найти числовые приближения для следующей системы ОДУ:
IVP := {x'(t) = -y(t) + x(t)^2,
y'(t) = 10*x(t) - y(t)^2,
x(0) = 1, y(0) = 1}:
fields := [x(t), y(t)]:
ODE := numeric::ode2vectorfield(IVP, fields):
numApprox := numeric::odesolve2(ODE)![]()
Постройте числовые решения для x(t) и y(t) в одном графике:
plotfunc2d(numApprox(t)[1], numApprox(t)[2], t = 0..20)

Используйте функцию построения графика plot::Curve2d, чтобы сгенерировать параметрический график числового решения:
curve := plot::Curve2d([numApprox(t)[1], numApprox(t)[2]],
t = 0..20):
plot(curve)
Также используйте plot::Ode2d или plot::Ode3d.