nm

11363 Reputation

20 Badges

13 years, 39 days

MaplePrimes Activity


These are questions asked by nm

I have an expression with number of csgn(arg) in it.

I'd like to scan this expression, telling Maple to assume arg is positive, in order to replace csgn(arg) by 1.

I am trying to do this using subsindets. But I do not know why it is not working. I am doing this in code, without looking at the expression. So I do not know what the arg's are and how many such cases could be.

Here is an example

expr:=(1+csgn(a)*a)/(3*csgn(b)*b);

To get to each csgn(arg), I am using the type 'specfunc( anything, csgn )'. I checked this is correct type by doing

type(csgn(a),'specfunc( anything, csgn )');

           true

Then

subsindets(expr,'specfunc( anything, csgn )', f->simplify(f) assuming positive);

But this does not change anything. 

I also tried

subsindets(expr,'specfunc( anything, csgn )',f->simplify(f) assuming op(1,f)::positive);

No change, But if I do 

simplify(csgn(a)) assuming positive;

it works. And Maple returns 1. Also this works

simplify(expr) assuming a>0,b>0;

But since I am do not before hand what the arguments to csgn() in the expression are, I can't do the above. I do not know even if expression has csgn() in it even. I am trying to simplify a result I obtain inside the program by doing the above.

What is wrong with my use of  subsindets above?

I think the problem is with using assumptions inside subsindents. As this below works

subsindets(expr,'specfunc( anything, csgn )',f->1);

So the call to subsidents was OK, it is just that the assumptions do not seem to be somehow effective inside.  May be name scoping issue?

Maple 2020.2

edit:

For now and as workaround, I am doing this

restart;
expr:=(1+csgn(a)*a)/(3*csgn(b)*b):
fun:=selectfun(expr,'csgn'); #find csgn if any

if numelems(fun)>0 then
    the_args:= op~(1,fun);
    simplify(expr) assuming map(x->x::positive,the_args)[];
fi;

 

I am still checking output using latest Latex and Maple 2020.2. I noticed a small problem.

Current Latex uses \mathrm{ln} instead of as before, which is just \ln this casues the space before the operator now to be lost, cause hard to read math.

It is better not to use \mathrm on ln

Here is an example

restart;
Latex:-Settings(UseImaginaryUnit=i,
      UseColor = false,
      powersoftrigonometricfunctions= computernotation,
      leavespaceafterfunctionname = true
):
expr:= 4*exp(3*x)+3*ln(x);
Latex(expr)

                       4 {\mathrm e}^{3 x}+3 \mathrm{ln}\left(x \right)

It should be

4 {\mathrm e}^{3 x}+3 \ln\left(x \right)

Without even \, between the letter before \ln as old latex() did:

latex(expr)

           4\,{{\rm e}^{3\,x}}+3\,\ln  \left( x \right)

As the Latex engine itself takes care of the spacing around math operators best.

Here is the difference when the Latex is compiled. The use of mathrm with exponential is not an issue, since it is one letter operator, but not with ln.

\documentclass[12pt]{book}
\usepackage{amsmath}
\usepackage{mleftright} 
\mleftright

\begin{document}
This is how it is now
\[
4 {\mathrm e}^{3 x}+3 \mathrm{ln}\left(x \right)
\]
                      
This is what it is better to be
\[
4 {\mathrm e}^{3 x}+3 \ln\left(x \right)
\]                                         
\end{document}

Compiled with lualatex compiler gives

The above shows the space problem.

Using Maple 2020.2 and Physics   879

 

There might be a setting for this. I do not know.

I  noticed, once I call Latex() first time, if I then later issue Typesetting:-Settings(prime=x,typesetprime=true); and after that, call Latex() again, it has no effect.  The derivative does not change.

But calling Typesetting:-Settings(prime=x,typesetprime=true); before calling Latex() the first time, works.

Since I do not want to do restart() in a running program, and I would like to call Typesetting:-Settings(prime=x,typesetprime=true); may be different times to change the letter and after having called Latex earlier, is there a way to make this work without having to do restart? I do not rememebr now if this was the case in earlier version or not. I looked at Latex:-Settings() and see no setting for this inside Latex itself to use in place of the above global Settings.

Please see worksheet below.


 

interface(version);

`Standard Worksheet Interface, Maple 2020.2, Windows 10, November 11 2020 Build ID 1502365`

Physics:-Version();

`The "Physics Updates" version in the MapleCloud is 879 and is the same as the version installed in this computer, created 2020, November 19, 20:10 hours Pacific Time.`

restart;
Latex:-Settings(UseImaginaryUnit=i,
      UseColor = false,
      powersoftrigonometricfunctions= computernotation,
      leavespaceafterfunctionname = true
):
ode:=2*diff(y(x),x)*x=(1+x-6*y(x)^2)*y(x):
#This works, since setting is called BEFORE calling Latex first time
Typesetting:-Settings(prime=x,typesetprime=true):
ode;
Latex(ode)

2*(diff(y(x), x))*x = (1+x-6*y(x)^2)*y(x)

2 y^{\prime}\left(x \right) x =
\left(1+x -6 y \left(x \right)^{2}\right) y \left(x \right)

restart;
Latex:-Settings(UseImaginaryUnit=i,
      UseColor = false,
      powersoftrigonometricfunctions= computernotation,
      leavespaceafterfunctionname = true
):
ode:=2*diff(y(x),x)*x=(1+x-6*y(x)^2)*y(x);
Latex(ode);

#This does not work, since setting is called AFTER calling Latex.
#The latex generated remains the same.
 
Typesetting:-Settings(prime=x,typesetprime=true);
ode;
Latex(ode)

2*(diff(y(x), x))*x = (1+x-6*y(x)^2)*y(x)

2 \left(\frac{d}{d x}y \left(x \right)\right) x =
\left(1+x -6 y \left(x \right)^{2}\right) y \left(x \right)

x, false

2*(diff(y(x), x))*x = (1+x-6*y(x)^2)*y(x)

2 \left(\frac{d}{d x}y \left(x \right)\right) x =
\left(1+x -6 y \left(x \right)^{2}\right) y \left(x \right)

 

 

Download how_to_change_setting.mw

 

 

After doing 

A:=tan(3*x);
B:=expand(A)

How to get A back from B? I tried

combine(B);
simplify(B,size);
simplify(B,trig);
simplify(B);

They do not give A back. tried few conversions to exp() and back and forth. Can't get original expression back.  trigsubs() does not help here.

This is all need to be done in code, assuming one can not look at the expression and decide what to do on any A/B pair. But I am mainly now looking at trig expressions.

Any suggestions?

Maple 2020.2

Both exp(x)^2 and exp(2*x) are correct and the same. 

simplify(exp(x)^2 - exp(2*x))

                     0

But I can't figure how to make Maple always use exp(2*x) instead. This is for exponent  in integers. This covers 90% of all cases in the Latex I generate.

This is only for Latex purposes and for typesetting only as it looks much better and more standard to use exp(2*x) than exp(x)^2.

Here is an example

restart;
expr:=-(2*x+1)*exp(-x)/(exp(-2*x))+(2*x+1)/exp(-2*x);
expand(expr)

The latex for the above looks like 

The Latex take much larger vertical space on the line. Compare the above to the same expression, but written with exponent inside

expr:=-2*exp(x)*x - exp(x) + 2*exp(2*x)*x + exp(2*x)

Which generates Latex

Which is much more pleasent to read and has less height as well.

Is there a way to automatically make Maple do that? Could I add my own `Latex\function` ? As described in 

https://www.maplesoft.com/support/help/Maple/view.aspx?path=latex%2ffunctions

How? Also, I am using Physics:-Latex and not :-latex, so I do not know if the above page would even apply here.

it will be hard to write code to manually fix this, by may be string searching and fix it as the program is running.

Any suggestions? Note that Mathematica automatically does this when the exponent is integer

Update

Thanks to the hint by Axel Voget below, I tried to use combine, but only target it to exp(x)^n part of the whole expression, as I do not want to apply combine to each expression. This is what I came up with

restart;
expr := -2*exp(x)*x - exp(x) + 2*exp(x)^2*x + exp(x)^2 + sin(x)^3 + cos(x)^2;
subsindets(expr,'exp(anything)^(anything)',f->combine(f));

Which seems to do what I want. It only applies to exp(x)^n and no other part. Compare this to applying combine to the whole expression

combine(expr)

Which might not be what I wanted.

I still need to test the above more, as may be I did not check for other cases. But if this works, then this will solve my problem. I can add this in one place, where it does this just before emitting the Latex. All my Latex generation is done inside one function which is called from everywhere. So I could easily add this there without changing anything else in the program.

 

First 105 106 107 108 109 110 111 Last Page 107 of 200