Два уравнения два неизвестных, нелинейные Mathematica

У меня возникают проблемы с получением значений с использованием функций NSolve или Solve в Mathematica для двух нелинейных уравнений с двумя неизвестными. Я уверен, что должен быть способ сделать это, но я не уверен, что это такое. Вот где я сталкиваюсь с проблемой:

bco2=29.6833
bdec=209.891
aco2=2.75447*10^6
bco2=7.94935*10^7
P=41.4
T=411
R=83.1446

Solve[{P = (R*T)/(vliq - (xco2*bco2 + (1 - xco2)*bdec)) 
- (xco2^2*aco2 + 2*xco2*(1 - xco2)*0.87*Sqrt[aco2*adec] 
+ (1 - xco2)^2*adec)/(vliq*(vliq + (xco2*bco2 + (1 - xco2)*bdec))), 
xco2 = yco2*phivap/(Exp[Log[vliq/(vliq - (xco2*bco2 + (1 - xco2)*bdec))] 
+ bco2/(vliq - (xco2*bco2 + (1 - xco2)*bdec)) 
- (2*(xco2*(aco2 + (1 - 0.13) Sqrt[aco2 + adec])))/(R*T*(xco2*bco2 + (1 - xco2)*bdec))*
Log[(vliq + (xco2*bco2 + (1 - xco2)*bdec))/vliq] + ((xco2^2*aco2 + 
2*xco2*(1 - xco2)*0.87*Sqrt[aco2*adec] + (1 - xco2)^2*adec)*bco2)/(R*
T*(xco2*bco2 + (1 - xco2)*bdec)^2)*(Log[(vliq + (xco2*bco2 + (1 - xco2)*bdec))/vliq]
- (xco2*bco2 + (1 - xco2)*bdec)/(vliq + (xco2*bco2 + (1 - xco2)*bdec))) 
- Log[(P*vliq)/(R*T)]])}, {xco2, vliq}]

Я также пытался использовать функцию NSolve безуспешно. Я немного заржавел в математике, поэтому, если у кого-то есть понимание, я был бы очень признателен; Заранее спасибо за вашу помощь!

1 ответ

Вы не можете использовать NSolve (или любую другую Nfunctions, потому что у вас есть переменные adec, phivap и yco2, которым не были присвоены значения), если вы не решаете все переменные, которым не были присвоены значения. Если вы знаете значения этих трех и просто не включили их, вы можете успешно использовать NSolve.

Если нет, то этот метод часто работает для сложных функций.

In[1]:= bco2 = 29.6833;
bdec = 209.891;
aco2 = 2.75447*10^6;
bco2 = 7.94935*10^7;
P = 41.4;
T = 411;
R = 83.1446;
NMinimize[{Norm[P - (R*T)/(vliq - (xco2*bco2 + (1 - xco2)*bdec)) - (xco2^2*aco2 + 
  2*xco2*(1 - xco2)*0.87*Sqrt[aco2*adec] + (1 - xco2)^2*adec)/(vliq*(vliq +
  (xco2*bco2 + (1 - xco2)*bdec)))] + Norm[xco2 - yco2*phivap/(Exp[Log[vliq/(vliq-
  (xco2*bco2 + (1 - xco2)*bdec))] + bco2/(vliq - (xco2*bco2 + (1 - xco2)*bdec)) -
  (2*(xco2*(aco2 + (1 - 0.13) Sqrt[aco2 + adec])))/(R*T*(xco2*bco2 + (1 - xco2)*
  bdec))*Log[(vliq + (xco2*bco2 + (1 - xco2)*bdec))/vliq] + ((xco2^2*aco2 +
  2*xco2*(1 - xco2)*0.87*Sqrt[aco2*adec] + (1 - xco2)^2*adec)*bco2)/(R*T*(xco2*
  bco2 + (1 - xco2)*bdec)^2)*(Log[(vliq + (xco2*bco2 + (1 - xco2)*bdec))/vliq] -
  (xco2*bco2 + (1 - xco2)*bdec)/(vliq + (xco2*bco2 + (1 - xco2)*bdec))) -
  Log[(P*vliq)/(R*T)]])]},
  {xco2, vliq, adec, phivap , yco2}]

Out[8]= {0.00652106, {xco2 -> -0.0000130274, vliq -> -0.154973, 
  adec -> -0.0437708, phivap -> 0.45787, yco2 -> 0.271248}}

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