Как решить функцию f (x, y) для x или y (если дано другое)? - PullRequest
0 голосов
/ 16 декабря 2018

Я начал работать с mathjs и попытался переписать некоторый код Python, используя sympy для алгебраических вычислений.Я реализовал функцию подгонки, которую я получил из исследовательской статьи (см. Ссылку во фрагменте кода, если интересно) в коде, и мне нужно переставить / решить это уравнение либо для мольной доли (переменная x_1), либо для плотности (переменная rho).

Как показано в примерах, приведенных в документах Я определил уравнение подбора как функцию двух интересующих меня переменных следующим образом:

const eqn = math.compile('f(x_1, rho) = param_1 + param_2 * temp + param_3 * rho + param_4 * rho^2 + param_5 * rho^(-1) + param_6 * temp * rho + param_7 * temp^(-1) - x_1')

Чтобы решить уравнение подгонки для интересующих меня переменных, я определила две различные области.Оба они содержат одинаковые постоянные параметры от param_1 до param_7 и значение температуры temp.Поскольку я хочу использовать решение для x_1, мне нужно указать отсутствующую переменную rho, которую я добавил в первую область (scope1).Чтобы решить уравнение для rho, я добавил недостающую переменную x_1 во вторую область (scope2).

С этими объяснениями мой код выглядит так:

const math = require('mathjs');

// physical properties and fit parameter
// fit from: 'doi:10.3390/fermentation4030072'
let scope1 = {
    // this scope is for solving the equation for `x_1`        
    param_1: -96.32780,     // -
    param_2: -0.02856512,   // 1/K
    param_3: 98.96611,      // cm3/g
    param_4: -37.81838,     // cm6/g2
    param_5: 35.07342,      // g/cm3
    param_6: 0.02844898,    // cm3/gK
    param_7: 36.74344,      // K
    temp: 293.15,
    rho: 0.93167,
}

let scope2 = {
    // this scope is for solving the equation for `rho`
    param_1: -96.32780,     // -
    param_2: -0.02856512,   // 1/K
    param_3: 98.96611,      // cm3/g
    param_4: -37.81838,     // cm6/g2
    param_5: 35.07342,      // g/cm3
    param_6: 0.02844898,    // cm3/gK
    param_7: 36.74344,      // K
    temp: 293.15,
    x_1: 0.224269,
}

const eqn = math.compile('f(x_1, rho) = param_1 + param_2 * temp + param_3 * rho + param_4 * rho^2 + param_5 * rho^(-1) + param_6 * temp * rho + param_7 * temp^(-1) - x_1')

// compiled expression/equation needs to be solved for `x_1`
const res1 = eqn.eval(scope1)
console.log(res1)

// compiled expression/equation needs to be solved for `rho`
const res2 = eqn.eval(scope2)
console.log(res2)

Что дает следующий вывод:

{ [Function: f] signatures: { 'any,any': [Function] }, syntax: 'f(x_1, rho)' }
{ [Function: f] signatures: { 'any,any': [Function] }, syntax: 'f(x_1, rho)' }

Как получить результаты из результатов res1 или res2 соответственно?

...