当我解决这个方程组时会发生TypeError

时间:2018-01-12 17:02:17

标签: python scipy typeerror sympy

int score = 0;
RadioGroup rgQ1;
RadioGroup rgQ2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    rgQ1 = findViewById(R.id.rg1);
    rgQ2 = findViewById(R.id.rg2);
 }


public void onRadioButtonClicked(View view) {

    // Is the button now checked? then assign into a boolean named 'checked'
    boolean checked = ((RadioButton) view).isChecked();

    // Question 1 logic
    // Check correct answer is checked and update score

    switch (view.getId()) {
        case R.id.frites:
            if (checked) score += 1;
            Log.v("MainActivity", "score" + score);
            break;
    }

    // Disable RadioButtons of rg1
    for (int i = 0; i < rgQ1.getChildCount(); i++) {
        (rgQ1.getChildAt(i)).setEnabled(false);
    }

    // Question 2 logic
    // Check correct answer is checked and update score

    switch (view.getId()) {
        case R.id.mille_feuille:
            if (checked) score += 1;
            Log.v("MainActivity", "score" + score);
            break;
    }

    // Disable RadioButtons of rg2
    for (int i = 0; i < rgQ2.getChildCount(); i++) {
        (rgQ2.getChildAt(i)).setEnabled(false);
    }
}

这是具有4个等式和4个未知数的代码。我正在尝试使用sympy.solve来解决这个方程式。但它不能解决错误;

from math import exp, log
from sympy import Symbol, symbols, solve, Eq
Z = 70;p_abs = 101.325*((1-2.25577*(10**-5)*Z)**5.2559);t_std = 15-0.0065*Z;RH = 0.5;t_db = 20
K_db = t_db + 273.15
C8 = -5.8002206e+03C9 = 1.3914993e+00;C10 = -4.8640239e-02;C11 = 4.1764768e-05;C12 = -1.4452093e-08;C13 = 6.5459673e+00
p_ws_db = exp(C8/K_db+C9+C10*K_db+C11*K_db**2+C12*K_db**3+C13*log(K_db))/1000
p_w_db = p_ws_db*RH # partial pressure of water vapor_db
W_s_db = 0.621945*p_ws_db/(p_abs-p_ws_db)
W_db = 0.621945*p_w_db/(p_abs-p_w_db)
p_w_wb = (W_db*p_abs)/(0.621945+W_db)
t_wb, K_wb, W_s_wb, p_ws_wb = symbols('t_wb K_wb W_s_wb p_ws_wb')
e1 = Eq(K_wb, t_wb + 273.15)
e2 = Eq(p_ws_wb, exp(C8/K_wb+C9+C10*K_wb+C11*K_wb**2+C12*K_wb**3+C13*log(K_wb))/1000)
e3 = Eq(W_s_wb, (W_db*((2501+1.86*t_db)-4.186*t_wb)+1.006*(t_db-t_wb))/(2501-2.326*t_wb))
e4 = Eq(p_ws_wb, (W_s_wb*p_abs)/(W_s_wb+0.621945))
print(fsolve([e1,e2,e3,e4], t_wb, p_ws_wb, K_wb, W_s_wb))

我猜exp或log会产生问题。

1 个答案:

答案 0 :(得分:1)

print(fsolve([e1,e2,e3,e4], t_wb, p_ws_wb, K_wb, W_s_wb))

SymPy中没有fsolve。 SciPy中有fsolve个数字求解器。 SciPy无法使用SymPy对象,特别是它将它们转换为浮点数。您从exp导入的logmath都不能。

理解数值计算和符号计算之间的区别。如果您想要计算exp(a)a是一个符号,则需要来自SymPy的符号exp,而不是来自数学或NumPy或其他地方的数字exp

更正导入声明:

from sympy import symbols, Eq, exp, log
from scipy.optimize import fsolve

正确执行数值解决方案:

eqns = lambdify([t_wb, p_ws_wb, K_wb, W_s_wb], [e.lhs - e.rhs for e in [e1, e2, e3, e4]])    
print(fsolve(lambda x: eqns(*x), [10, 10, 10, 10]))

在这里,lambdify创建了一个SciPy可以使用的函数,来自您拥有的SymPy对象。它是在数字模块中使用SymPy对象的主要工具。创建的函数接受四个参数,首先列出,并返回四个输出,这是每个等式的左右两边之间的差异。

初始向量[10, 10, 10, 10]只是对解决方案的猜测,fsolve需要它作为起点。它找到的解决方案是

[1.51295417e+03 7.10681717e+01 1.78610417e+03 1.50246122e+00]