Thursday, February 11, 2010

Matlab формулы через LaTeX в MS Word.

Проблема

Очень часто приходится в лабораторных, домашних и курсовых работах портировать/набирать формулы, дабы показать цепочку размышлений, алгоритм или аналитический вывод. К тому же очень часто используется Matlab, для расчетов. Если задача решается символьно (symbolic computations) то по сути надо перенабивать формулы вывода Matlab с командного окна в Word или Open Office. Довольно нудная и неблагодарная работа.

Решение

Порившись немного в help, нашел все таки, что нужно. Есть такая функция latex(), которая представляет символьное выражение в LaTeX виде.  Да к стате, чтобы  переводить формулы из Matlab в MS Word, LaTex знать не обязательно.
Для примера возьмем простую программку:
%clear workspace and console output
clc
clear
%define of symbolic variables  
syms t beta_1 omega

%build symbolic expression 
%movement of angle  
alpha_2=atan(tan(t*omega)/cos(beta_1))
%differentiates movement of angle 2 times
ddalpha_2=diff(alpha_2,t,2)



Вывод в консоли будет следующим:
alpha_2 =
 
atan(tan(omega*t)/cos(beta_1))
 
 
ddalpha_2 =
 
(2*omega^2*tan(omega*t)*(tan(omega*t)^2 + 1))/(cos(beta_1)*(tan(omega*t)^2/cos(beta_1)^2 + 1)) - (2*omega^2*tan(omega*t)*(tan(omega*t)^2 + 1)^2)/(cos(beta_1)^3*(tan(omega*t)^2/cos(beta_1)^2 + 1)^2)


Не очень читабельно, не правда ли? Можно конечно использовать функцию pretty (), что сделает формулы наглядными, но в любом случае надо будет их вручную набирать.
Добавим в коде еще пару строк:

tex_out_alpha_2 = latex(alpha_2)
tex_out_ddalpha_2 = latex(ddalpha_2)

Эти команды просто преобразуют коды Matlab в LaTeX. В командном окне получим результаты:
tex_out_alpha_2 =

\arctan\!\left(\frac{\tan\!\left(\mathrm{omega}\, t\right)}{\cos\!\left(\mathrm{beta}_{1}\right)}\right)


tex_out_ddalpha_2 =

\frac{2\, {\mathrm{omega}}^2\, \tan\!\left(\mathrm{omega}\, t\right)\, \left({\tan\!\left(\mathrm{omega}\, t\right)}^2 + 1\right)}{\cos\!\left(\mathrm{beta}_{1}\right)\, \left(\frac{{\tan\!\left(\mathrm{omega}\, t\right)}^2}{{\cos\!\left(\mathrm{beta}_{1}\right)}^2} + 1\right)} - \frac{2\, {\mathrm{omega}}^2\, \tan\!\left(\mathrm{omega}\, t\right)\, {\left({\tan\!\left(\mathrm{omega}\, t\right)}^2 + 1\right)}^2}{{\cos\!\left(\mathrm{beta}_{1}\right)}^3\, {\left(\frac{{\tan\!\left(\mathrm{omega}\, t\right)}^2}{{\cos\!\left(\mathrm{beta}_{1}\right)}^2} + 1\right)}^2}

Бред... Он нам поможет!!!

Что бы корректно воспроизвести формулы, необходимо установить надстройку для MS Word, которая называется MathType. В моем случае была использована 6 я версия. Устанавливаем прогу, появляется новая вкладка (Office 2007) на панели. Дальше нужно проделать следующие действия (в картинках, без комментариев):
Step 1
Step 2
 
Step 3
  

Step 4
  

Step 5
 

Все сконфигурировано, теперь просто вставим LaTeX (тот бредовый набор символов ) текст в редактор  формул, результат будет слудующим:
 


Неплохо, правда? Первую формулу можно было конечно набрать, но вторую? (Мне было бы лень)
Нужно заметить, что в LaTeX индекс обозначается через нижние подчеркивание, k_1 = k1. То есть обозначив символьную переменную в таком виде, мы определяем ее индекс. Важно, то что если переменная будет задана в виде k_22 то индексом будет считаться только первый символ, результат будет k12. (в LaTeX если символов в индексе больше чем один, их нужно заключить в фигурные скобки k_{22} ).Важно это помнить, да бы не запутаться потом.

Теперь попробуем заменить названия переменных на грецкие буквы:
Немного модифицируем нашу программу:

clc
clear
syms t beta_1 omega
alpha_2=atan(tan(t*omega)/cos(beta_1))
ddalpha_2=diff(alpha_2,t,2)
tex_out_alpha_2 = latex(alpha_2)
tex_out_ddalpha_2 = latex(ddalpha_2)

%find 'beta'  and replace on  '\\beta'
str_find='beta'
str_replace = '\\beta'
str_out = regexprep(tex_out_alpha_2, str_find, str_replace)

%find 'omega'  and replace on  '\\omega' 
str_find ='omega'
str_replace = '\\omega'
str_out = regexprep(str_out, str_find, str_replace)


Добавленные команды 'beta' на '\\beta' (для LaTeX нужно только \beta, но для того чтобы Matlab не запутался, \ обозначают как \\).
\beta и \omega -нарисует соответственно грецкую бету и омегу.



Так лучше?Теперь попробуем вставить LaTeX код в Kile. Минимальный документ с формулой будет иметь вид:


\documentclass[a4paper,10pt]{article}
\usepackage[utf8x]{inputenc}

%opening
\title{}
\author{}

\begin{document}

\maketitle

\begin{abstract}

\end{abstract}

\[
\frac{2\, {\mathrm{\omega}}^2\, \tan\!\left(\mathrm{\omega}\, t\right)\, \left({\tan\!\left(\mathrm{\omega}\, t\right)}^2 + 1\right)}{\cos\!\left(\mathrm{\beta}_{1}\right)\, \left(\frac{{\tan\!\left(\mathrm{\omega}\, t\right)}^2}{{\cos\!\left(\mathrm{\beta}_{1}\right)}^2} + 1\right)} - \frac{2\, {\mathrm{\omega}}^2\, \tan\!\left(\mathrm{\omega}\, t\right)\, {\left({\tan\!\left(\mathrm{\omega}\, t\right)}^2 + 1\right)}^2}{{\cos\!\left(\mathrm{\beta}_{1}\right)}^3\, {\left(\frac{{\tan\!\left(\mathrm{\omega}\, t\right)}^2}{{\cos\!\left(\mathrm{\beta}_{1}\right)}^2} + 1\right)}^2}
\]
\end{document} 



Нужно заметить, что в LaTeX редакторах нужно не просто вставить формулу из Matlab, но заключить ее в  "\[" и  "\[" (без кавычек):

\[
\arctan\!\left(\frac{\tan\!\left(\mathrm{\omega}\, t\right)}{\cos\!\left(\mathrm{\beta}_{1}\right)}\right)
\] 

Думаю идея понятна))), надеюсь поможет Вам с экономить время и избавиться от рутинной работы. Когда разберусь с регулярными выражениями, постараюсь решить проблему с индексами да и более красиво реализовать замену строк.
 Полезные ссылки:
http://www.mathworks.com/access/helpdesk/help/toolbox/symbolic/latex.html
http://www.math.harvard.edu/texman/node21.html

No comments:

Post a Comment