非常大的 MATLAB 方程需要放入 LaTeX

非常大的 MATLAB 方程需要放入 LaTeX

我在 MATLAB 中有一个非常大的方程

f1=((y_o2_ca_in*M_o2/(y_o2_ca_in*M_o2+(1-y_o2_ca_in)*M_n2))*(((k_sm_out*(x5-((x1*R_o2+x3*R_n2+x8*R_v)*t_st/v_ca)))+((M_v/M_a)*phi_des*(((10^(-1.69*10^-10*t_cl^4+3.85*10^-7*t_cl^3-3.39*10^-4*t_cl^2+0.143*t_cl-20.92))*10^3)/(x5-(((x5*phi_atm*p_sat_t_atm)/(p_atm*p_sat_t_cl))*p_sat_t_cl)))*((1/(1+((M_v/M_a)*((((x5*phi_atm*p_sat_t_atm)/(p_atm*p_sat_t_cl))*p_sat_t_cl)/(x5-(((x5*phi_atm*p_sat_t_atm)/(p_atm*p_sat_t_cl))*p_sat_t_cl))))))*(k_sm_out*(x5-((x1*R_o2+x3*R_n2+x8*R_v)*t_st/v_ca))))-((k_sm_out*(x5-((x1*R_o2+x3*R_n2+x8*R_v)*t_st/v_ca)))-((1/(1+((M_v/M_a)*((((x5*phi_atm*p_sat_t_atm)/(p_atm*p_sat_t_cl))*p_sat_t_cl)/(x5-(((x5*phi_atm*p_sat_t_atm)/(p_atm*p_sat_t_cl))*p_sat_t_cl))))))*(k_sm_out*(x5-((x1*R_o2+x3*R_n2+x8*R_v)*t_st/v_ca)))))))/(1+((M_v/(y_o2_ca_in*M_o2+(1-y_o2_ca_in)*M_n2))*(((x5*0.5*p_sat_t_atm/(p_atm*p_sat_t_cl))*((10^(-1.69*10^-10*t_ca_in^4+3.85*10^-7*t_ca_in^3-3.39*10^-4*t_ca_in^2+0.143*t_ca_in-20.92))*10^3))/(((x5-(((x5*phi_atm*p_sat_t_atm)/(p_atm*p_sat_t_cl))*p_sat_t_cl))+phi_des*((10^(-1.69*10^-10*t_cl^4+3.85*10^-7*t_cl^3-3.39*10^-4*t_cl^2+0.143*t_cl-20.92))*10^3))-((x5*0.5*p_sat_t_atm/(p_atm*p_sat_t_cl))*((10^(-1.69*10^-10*t_ca_in^4+3.85*10^-7*t_ca_in^3-3.39*10^-4*t_ca_in^2+0.143*t_ca_in-20.92))*10^3))))))))-((((x1*R_o2*t_st/v_ca)/((x1*R_o2*t_st/v_ca)+(x3*R_n2*t_st/v_ca)))*M_o2/(((x1*R_o2*t_st/v_ca)/((x1*R_o2*t_st/v_ca)+(x3*R_n2*t_st/v_ca)))*M_o2+(1-((x1*R_o2*t_st/v_ca)/((x1*R_o2*t_st/v_ca)+(x3*R_n2*t_st/v_ca))))*M_n2))*(1/(1+((M_v/(((x1*R_o2*t_st/v_ca)/((x1*R_o2*t_st/v_ca)+(x3*R_n2*t_st/v_ca)))*M_o2+(1-((x1*R_o2*t_st/v_ca)/((x1*R_o2*t_st/v_ca)+(x3*R_n2*t_st/v_ca))))*M_n2))*((x8*R_v*t_st/v_ca)/((x1*R_o2*t_st/v_ca)+(x3*R_n2*t_st/v_ca)))))*(k_ca_out*(((x1*R_o2+x3*R_n2+x8*R_v)*t_st/v_ca)-x9))))-((M_o2*n*i_st)/(4*F));

我想将其放入 LaTeX 中。我尝试了各种方法,例如使用列表、方程式拆分等,但它太大了,无法放入 LaTeX。请求您的指导/帮助。

答案1

以下是我解开和手动包装代码的手动方法:

\documentclass{article}
\usepackage{showframe}
\usepackage{listings}

\begin{document}
    \begin{lstlisting}[language=Matlab,gobble=8]
        a = x1*R_o2*t_st/v_ca;
        b = x3*R_n2*t_st/v_ca;
        c = x1*R_o2+x3*R_n2+x8*R_v;
        d = x5*phi_atm*p_sat_t_atm/(p_atm*p_sat_t_cl)*p_sat_t_cl;
        e = (10^(-1.69e-10*t_cl^4
                 +3.85e-07*t_cl^3
                 -3.39e-04*t_cl^2
                 +1.43e-01*t_cl
                 -20.92))*10^3;
        f = x5*0.5*p_sat_t_atm/(p_atm*p_sat_t_cl)*e;
        g = y_o2_ca_in*M_o2+(1-y_o2_ca_in)*M_n2;
        h = c*t_st/v_ca;
        i = k_sm_out*(x5-h);

        j = (M_v/M_a)*phi_des*(e/(x5-d));
          * ((1/(1+((M_v/M_a)*(d/(x5-d)))))*i);
        k = i-(1/(1+((M_v/M_a)*(d/(x5-((dtm)/(p_atm*p_sat_t_cl))
            *p_sat_t_cl)))))*i;
        l = (a/(a+b))*M_o2/((a/(a+b))*M_o2+(1-(a/(a+b)))*M_n2);
        m = (M_v/((a/(a+b))*M_o2+(1-(a/(a+b)))*M_n2))
          * ((x8*R_v*t_st/v_ca)/(a+b));

        f1 = y_o2_ca_in*M_o2/g*(i+(j-k))/(1+((M_v/g)*(f/(e-f))))
           - l*(1/(1+m)*(k_ca_out*(h-x9)))
           - ((M_o2*n*i_st)/(4*F));
    \end{lstlisting}
\end{document}

我的两个答案的比较

变量atoi是原始赋值中出现多次的子表达式。变量jtom只出现一次,但是为了缩短最终赋值的长度而引入的。当然,如果能为这些变量找到合理的名称就好了,但如果不知道这个等式的作用,这是不可能的。

这个解决方案实际上比自动换行原始方程更短(无论是字符还是行数)。如果您决定使用它,请验证我没有引入任何错误!

[编辑]最后,这是上述内容的数学版本:

\documentclass{article}
\usepackage{showframe}
\usepackage{amsmath}
\usepackage{mathtools}

\begin{document}
    \begin{align*}
        a &= x_1 R_{o_2}\cdot\frac{t_{st}}{v_{ca}}&
        b &= x_3 R_{n_2}\cdot\frac{t_{st}}{v_{ca}}\\
        c &= x_1 R_{o_2} + x_3 R_{n_2} + x_8 R_v&
        d &= x_5 \phi_{atm}\cdot\frac{p_{sat,t,atm}}{p_{atm}}\\
        e &= \mathrlap{10^{3 - 1.69\cdot10^{-10}\cdot t_{cl}^4 + 3.85\cdot10^{-7}\cdot t_{cl}^3 - 3.39\cdot10^{-4}\cdot t_{cl}^2 + 1.43\cdot10^{-1}\cdot t_{cl} -20.92}}\\
        f &= \frac{x_5}2\cdot\frac{p_{sat,t,atm}}{p_{atm}\cdot p_{sat,t,cl}}\cdot e&
        g &= y_{o_2,ca,in}\cdot M_{o_2} + 1 - y_{o_2,ca,in}\cdot M_{n_2}\\
        h &= c \cdot \frac{t_{st}}{v_{ca}}&
        i &= k_{sm,out}\cdot(x_5-h)\\
        j &= \frac{M_v}{M_a}\cdot\frac{\phi_{des}\cdot e}{x_5-d}\cdot\frac{i}{1+\frac{M_v}{M_a}\cdot\frac{d}{x_5-d}}&
        k &= i-\frac{i}{1+\frac{M_v}{M_a}\cdot\frac{d}{x_5-\frac{dtm}{p_{atm}}}}\\
        l &= \mathrlap{\frac{a}{a+b}\cdot \frac{M_{o_2}}{\frac{a}{a+b}\cdot M_{o_2} + \left(1-\frac{a}{a+b}\right)\cdot M_{n_2}}}\\
        m &= \mathrlap{\frac{M_v}{\frac{a}{a+b}\cdot M_{o_2}+\left(1-\frac{a}{a+b}\right)\cdot M_{n_2}}\cdot\frac{x_8 R_v\cdot\frac{t_{st}}{v_{ca}}}{a+b}}\\
        f_1 &= \mathrlap{\frac{y_{o_2,ca,in}\cdot\frac{M_{o_2}}{g}\cdot(i+j-k)}{1+\frac{M_v}{g}\cdot\frac{f}{e-f}} - l\cdot\frac1{1+m}\cdot k_{ca,out}\cdot(h-x_9) - \frac{M_{o_2}\cdot n\cdot i_{st}}{4F}}
    \end{align*}
\end{document}

上述代码的输出

我使用两列来显示方程式,以节省较短方程式的空间,并使用\mathrlap{}frommathtools使较长的方程式跨越多列。

也许这是可以合作的,尽管它本身并不漂亮。

答案2

您始终可以使用 lstlisting 的breaklines选项:

\documentclass{article}
\usepackage{showframe}
\usepackage{listings}

\begin{document}
    \begin{lstlisting}[language=matlab,breaklines,gobble=8]
        f1=...;
    \end{lstlisting}
\end{document}

上述示例的输出

当然,这并不能神奇地使代码变得可读。它看起来像是自动生成的,但也许可以通过提取一些常用术语将其分解为单独的语句。

否则,我建议包含一个在线版本的链接或二维码,以便读者可以使用他们最喜欢的编辑器来剖析代码。

答案3

与文本不同,在方程式中,您需要手动进行连字符连接。为此,您可以使用包\begin{split}中的amsmath。以下是简单的代码,用于展示其工作原理

\documentclass{article}
\usepackage{amsmath}

\begin{document}

\[
\begin{split}
f(x)&=x^2+y\\
&y+8\\
f(x)g(x)&=x^3
\end{split}
\] 

\end{document}

\[...\]类似于$$...$$,但是更好。

相关内容