Оценка температуры с помощью уравнения Антуана с классами - PullRequest
0 голосов
/ 19 февраля 2019

Мне нужна помощь в получении темпов с помощью Antoine Eq с использованием классов.

Мое действие root не выполняется, и я не знаю почему.

Мой код:

from __future__ import division, print_function
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import root

class Chemical(object):

    def __init__(self, name_1, balance_1, name_2, balance_2):
        self.name = name_1 + ' ' + '+' + ' ' + name_2
        self.data_1 = []
        self.data_2 = []
        self.data_1 = balance_1
        self.data_2 = balance_2

    def __str__(self):
        if (self.name):
            return "Mixture: %s" % (self.name)
        else:
            return None

    def bubble_solve(self,a,P = 1.01,T = 300):
        A1,B1,C1 = self.data_1
        A2,B2,C2 = self.data_2
        PA = 10**(A1 - B1/(C1+T)) 
        PB = 10**(A2 - B2/(C2+T)) 
        sol = root(lambda T: P - (a*PA + (1-a)*PB),T)
        return sol.x[0]

    def dew_solve(self, b, P = 1.01, T = 300):
        A1,B1,C1 = self.data_1
        A2,B2,C2 = self.data_2
        PA = 10**(A1 - B1/(C1+T)) 
        PB = 10**(A2 - B2/(C2+T)) 
        sol = root(lambda T: 1 - (b*P/PA + (1-b)*P/PB), T)
        return sol.x[0]


mixture = Chemical('benzene', [ 3.98523 , 1184.24 , -55.578], 'toulene', 
[4.05043 , 1327.62 , -55.528])
print(mixture)
print()

print(mixture.bubble_solve(0.5)) #at a = 0.5
print(mixture.bubble_solve(0.5,2)) #at a = 0.5 and P = 2
print(mixture.dew_solve(0.5)) #at b = 0.5
print(mixture.dew_solve(0.5,2)) #at b = 0.5 and P = 2

Это то, что печатает мой код:

Mixture: benzene + toulene

300.0
300.0
300.0
300.0

Однако ответы должны быть: 365,087, 390,14188, 371,7743, 396,688.

Почему действие rootпотерпеть неудачу?

1 Ответ

0 голосов
/ 19 февраля 2019

Добро пожаловать в StackOverflow, @Nathaniel!

Проблема в ваших PA, PB и sol строках в bubble_solve и dew_solve.Вы, кажется, смешиваете константы с независимыми переменными!Например, с вашим решением пузыря, у вас есть значение по умолчанию 300, установленное для T.Таким образом, в строке PA значение 300 используется для T!Один из способов исправить это будет следующим:

    ...
    def bubble_solve(self,a,P = 1.01,T = 300):
        A1,B1,C1 = self.data_1
        A2,B2,C2 = self.data_2
        PA = lambda x: 10**(A1 - B1/(C1+x)) 
        PB = lambda x: 10**(A2 - B2/(C2+x)) 
        sol = root(lambda x: P - (a*PA(x) + (1-a)*PB(x)),T)
        return sol.x[0]

    def dew_solve(self, b, P = 1.01, T = 300):
        A1,B1,C1 = self.data_1
        A2,B2,C2 = self.data_2
        PA = lambda x: 10**(A1 - B1/(C1+x)) 
        PB = lambda x: 10**(A2 - B2/(C2+x)) 
        sol = root(lambda x: 1 - (b*P/PA(x) + (1-b)*P/PB(x)), T)
        return sol.x[0]
    ...

Это вернет ожидаемые вами значения.Обратите внимание, что я использую x в качестве независимой переменной для PA и PB, но это произвольно.Однако, вероятно, лучше не использовать T для ваших анонимных функций, если вы передаете ему значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...