Два уравнения два неизвестных, нелинейные 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}}
Это работает, делая разницу левой и правой стороны как можно меньше. Если ваша функция имеет локальные минимумы, это может оказаться в одном из них. Если у вас есть информация о том, где может находиться результат, вы можете добавить ограничения и помочь найти подходящее решение.