Ask Your Question
0

How can I print equations just like latex?

asked 2015-02-13 08:34:10 +0200

Nownuri gravatar image

updated 2015-02-13 09:11:34 +0200

slelievre gravatar image

Now I'm testing several equations and solutions with Sage. After testing the solutions, I'd present it to the group members. But I met a problem to print the equations.

For example, when I write the code.

sage: z(x)=6/(5*pi*50*(x^2+25))*exp((-x+sqrt(x^2+25))/50)
sage: view (z)

Then the sage doesn't show the equation that is exactly same with the code, but it just shows simplified form. Could anyone let me know how to show the original equation?

And it would be also appreciated, if you tell me how to modify the simplifying mechanism. I'd love to write equations that don't contain any large denominators with many exponential terms.

thank you.

edit retag flag offensive close merge delete

3 Answers

Sort by ยป oldest newest most voted
3

answered 2015-02-17 07:45:29 +0200

Thorsten gravatar image

There is the hold option, which might can help:

 z(x)=x.power(2).mul(x,hold=true)
 view(z)

which evaluates to $x \mapsto x^2x$ For an easier typing one could use Infix opertors:

 def hold_mult(a,b):
     return a.mul(b,hold=true)
 h = infix_operator('multiply')(hold_mult)

and then use x^2 *h* x.

However in your case if you need just the initial equation to display it might be the easiest just to print it as a string. If you need this functionality more often, an (extendet version of a) function like this could be helpful:

def paranthese_match(prefix,str):
   matches = []
   while (str.find(prefix) != -1):
       p = -1
       for li in [str.find(prefix)+len(prefix)..len(str)-1]:
           if str[li] == '(':
             p -=1
           if str[li] == ')':
             p += 1
           if p==0:
              matches.append(str[str.find(prefix)+len(prefix):li])
       str = str[li:]
   return matches
def print_expression(str):
   str = str.replace('*',' \cdot ')
   str = str.replace('pi',' \pi ')
   for sr in paranthese_match('sqrt(',str):
       str = str.replace('sqrt('+sr+")",'\sqrt{'+sr+'}')
   for sr in paranthese_match('exp(',str):
       str = str.replace('exp('+sr+")",'e^{'+sr+'}')
   html("$"+str+"$")

Then print_expresion("6/(5*pi*h*50*h*(x^2+25))*h*exp((-x+sqrt(x^2+25))/50)") leads to $6/(5 \cdot \pi \cdot h \cdot 50 \cdot h \cdot (x^2+25)) \cdot h \cdot e^{(-x+\sqrt{x^2+25})/50}$

edit flag offensive delete link more

Comments

Thanks, that's exactly what I was looking for! I changed the line html("$"+str+"$") to print "$"+str+"$" to get raw Latex from a Sage expression. Note that the print_expresion("6/(5*... line should read print_expression("6/(5*... with 2 s's. Also, for those interested: you can print the Latex code for an already defined symbolic equation by converting it to a string as print_expression(str(Lambda)) where Lambda is the name of your symbolic equation.

louisgag gravatar imagelouisgag ( 2017-01-25 18:27:44 +0200 )edit
3

answered 2015-02-17 08:02:37 +0200

updated 2015-02-17 22:32:24 +0200

I was looking for the same thing and found these comments on the issue.

This works with a _few_ functions, but not all.

This is probably the best answer on why it does this simplification (and why there's no way to stop it)

As far as the simplification mechanisms, you can look at this page. There are a number of them spread throughout that highlight different means:

If you're looking to just reproduce the same text as your input, unfortunately I have found no better way than writing it out in LaTeX as a initial condition step so Sage doesn't mangle the form. This is a quick latex renderer that I modified from a this post on ask.sagemath

def latexrender(s):
    try:
        pic = text("$" + s.replace('$','\$') + "$",(0,0),axes=False,figsize=1,color='black',fontsize=20)
        pic.show()
    except:
        latexrender(latex(s))
    return
edit flag offensive delete link more
1

answered 2017-02-02 12:07:08 +0200

louisgag gravatar image

updated 2017-02-02 12:12:39 +0200

I've created an extended version of the script given by Thorsten and posted it on GitHub. This way I will keep it updated were I to make changes or receive suggestions: sageToLatex.sage

LATEX PACKAGES REQUIRED:

*) add the following two lines to the header of you main Latex file if theses packages are not already declared:

\usepackage{esdiff} % for non-italic derivatives

\usepackage{breqn} % automatic linebreaks for eqns

INSTRUCTIONS:

1) paste the whole sageToLatex.sage file somewhere near the beginning of your worksheet and uncomment the following line to set the boolean printArticle as such:

printArticle = bool(1) # enable if want to print the text and equations for the article

2) in your document, include, where desired, the following string additions:

if (printArticle):
   latexPrint += 'YOUR TEXT,' + get_expression('derivative(x/b + 5 + sqrt(3/b),x)', isEqn=bool(1))

3) at the end of your document create the Latex file that you can then include (ex: \input{myEqns.tex}) in your master Latex document:

if (printArticle):
    fLATEX=open('myEqns.tex','w')
    fLATEX.write(latexPrint)
    fLATEX.close()
edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

3 followers

Stats

Asked: 2015-02-13 08:34:10 +0200

Seen: 10,033 times

Last updated: Feb 02 '17