![非常大的 MATLAB 方程需要放入 LaTeX](https://linux22.com/image/329685/%E9%9D%9E%E5%B8%B8%E5%A4%A7%E7%9A%84%20MATLAB%20%E6%96%B9%E7%A8%8B%E9%9C%80%E8%A6%81%E6%94%BE%E5%85%A5%20LaTeX%20.png)
我在 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}
变量a
toi
是原始赋值中出现多次的子表达式。变量j
tom
只出现一次,但是为了缩短最终赋值的长度而引入的。当然,如果能为这些变量找到合理的名称就好了,但如果不知道这个等式的作用,这是不可能的。
这个解决方案实际上比自动换行原始方程更短(无论是字符还是行数)。如果您决定使用它,请验证我没有引入任何错误!
[编辑]最后,这是上述内容的数学版本:
\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}
\[...\]
类似于$$...$$
,但是更好。