#wolfram-mathematica
Вопрос:
Я пытаюсь решить систему из двух уравнений, одно из которых неявно. Используя Solve[], я получил 2 решения. Однако одно из решений не является точкой для одного из уравнений, и графически эти два уравнения не пересекаются в точке. Я в замешательстве от того, как mathematica вычислила это решение, учитывая, что оно удовлетворяет только одному из уравнений. Вот два уравнения, p и T являются единственными переменными.
Уравнение 1:
p = [Phi]/R ((1 - [Phi]) [Phi] (1 - [Lambda]) [Beta])/(((W -
p T) R [Phi] T) R [Phi] (1 - [Phi]) T)/(
R ([Lambda]/((W -
p T) R [Phi] T ) ((1 - [Lambda]) [Beta] R)/(((W -
p T) R [Phi] T) R [Phi] (1 - [Phi]) T)))
и второе уравнение имеет постоянное произведение:
p = A/T
p и T-единственные переменные, все остальные-параметры.
Чтобы решить уравнения, я сделал:
Solve[p - [Phi]/
R - ((1 - [Phi]) [Phi] (1 - [Lambda]) [Beta])/(((W -
p T) R [Phi] T) R [Phi] (1 - [Phi]) T)/(
R ([Lambda]/((W -
p T) R [Phi] T ) ((1 - [Lambda]) [Beta] R)/(((W -
p T) R [Phi] T) R [Phi] (1 - [Phi]) T))) == 0 amp;amp;
p == A/T , {p, T}]
и решения таковы:
{{p -> -0.0000199018, T -> -5.02466*10^6}, {p -> 0.319279,
T -> 313.206}}
Однако, когда я подставил T = -5,02466*(10^6) в уравнение 1, я получил
{p -> 0,325402} вместо {p ->> -0.0000199018}
T = -5.02466*(10^6)
FindRoot[p - [Phi]/
R - ((1 - [Phi]) [Phi] (1 - [Lambda]) [Beta])/(((W -
p T) R [Phi] T) R [Phi] (1 - [Phi]) T)/(
R ([Lambda]/((W -
p T) R [Phi] T ) ((1 - [Lambda]) [Beta] R)/(((W -
p T) R [Phi] T) R [Phi] (1 - [Phi]) T))), {p, 0.2}]
вывод {p -> 0,325402}
Значения параметров являются:
[Beta] = 0.95
R = 1/[Beta]
W = 1000000
A = 100
[Phi] = 1/5
[Lambda] = 0.1
Кто-нибудь знает, как было получено решение {p — > -0.0000199018, T — > > -5.02466*10^6}? Это точка в уравнении 2, но не в уравнении 1. На графике ниже я построил оба уравнения. p-ось y, T-ось x. Синяя линия-это p = A/T, почему она выглядит волнистой?
Ответ №1:
TLDR : Mathematica правильно выполнила свою работу с начальной Solve
Я думаю, что здесь происходит много разных вещей. Во-первых, Solve
действительно выдает конкретное предупреждение.
Solve::ratnz: Solve was unable to solve the system with inexact coefficients. The answer was obtained by solving a corresponding exact system and numericizing the result.
Если вы замените любой из ответов, предоставленных Mathematica, они действительно удовлетворяют обоим уравнениям (с некоторой степенью численной точности). Информированный первоначальным предупреждением при использовании Solve
, я думаю, что это связано с проблемой числовой точности.
Достаточно интересно, что если вы перевернете обратное уравнение и используете NSolve
его, это больше не будет проблемой.
exp1 = p - [Phi]/
R - ((1 - [Phi]) [Phi] (1 - [Lambda]) [Beta])/(((W -
p T) R [Phi] T) R [Phi] (1 - [Phi]) T)/(R (
[Lambda]/((W -
p T) R [Phi] T) ((1 - [Lambda]) [Beta] R)/(((W -
p T) R [Phi] T) R [Phi] (1 - [Phi]) T)));
NSolve[exp1 == 0 amp;amp; p == A/T, {p, T}]
{{p -> 0., T -> -5.02466*10^6}, {p -> 0.319279, T -> 313.206}}
NSolve[{exp1 == 0, T == A/p}]
{{p -> 0.319279, T -> 313.206}}
Что касается волнистых линий, я снова думаю, что артефакт из ContourPlot
того, что вы используете. Если вы просто используете Plot[A/T, {T, -10000, 10000},
, этого не существует.
Итак, теперь возникает вопрос, почему это не отражено в ContourPlot
том, что вы сгенерировали. Я думаю, что если вы уйдете далеко (в фактический диапазон решений), сюжет не будет сгенерирован должным образом. Я могу ошибаться, но я думаю ContourPlot
, что на данный момент мы просим слишком многого. Чтобы понять, почему {p -> 0., T -> -5.02466*10^6}
это правильное решение, я сделал следующее. Я заменил p
, и просто построил график результата против T
.
Plot[exp1 /. p -> 0, {T, -10^7, 10^7}]
И вы можете видеть, что это выражение действительно пересекает ось x при том самом отрицательном 1. Большое спасибо! T
значении, которое было первоначально найдено.