nm

8552 Reputation

19 Badges

13 years, 33 days

MaplePrimes Activity


These are questions asked by nm

I have been using simplify() in number of places, and not really expecting it will do any harm. At worst, it will have no effect, or it will change the expression to different form, but the semantics will remain the same.

Until I noticed that odetest() fail on some of my solutions because I called simplify  on the solution before.

One example why this happens, is that Maple simplifies cos(2*x)*sqrt(1/cos(2*x)^2) to csgn(1/cos(2*x)) and this makes odetest fail. Adding assuming x::real has no effect on making odetest happy.

So now I changed simplify(sol) to simplify(sol,size) and this seems so far not to have this adverse effect. 

My main reason for calling simplify  is to make the expression smaller. In Mathematica that is what I do, In Mathematica there is no "size" option to Simplify.

So now, I am very worried about calling simplify() as is.

Could some Maple experts share some of their experience on this? Should one call simplify() only when an explicit option, like size, trig, exp, etc....is also used and not call simplify as is?

restart;

ode:= diff(y(x),x) = 2+2*sec(2*x)+2*y(x)*tan(2*x);
my_sol:= y(x) = ((2*x+sin(2*x))/(cos(2*x)*sqrt(1/cos(2*x)^2))+_C1)*sqrt(1+tan(2*x)^2);
odetest(my_sol,ode);

diff(y(x), x) = 2+2*sec(2*x)+2*y(x)*tan(2*x)

y(x) = ((2*x+sin(2*x))/(cos(2*x)*(1/cos(2*x)^2)^(1/2))+_C1)*(1+tan(2*x)^2)^(1/2)

0

#now simplify the solution first
simplify(my_sol);
odetest(%,ode);

y(x) = (_C1*csgn(1/cos(2*x))+sin(2*x)+2*x)/cos(2*x)

csgn(1, 1/cos(2*x))*_C1/cos(2*x)

simplify(my_sol) assuming x::real;
odetest(%,ode);

y(x) = (_C1*signum(cos(2*x))+sin(2*x)+2*x)/cos(2*x)

signum(1, cos(2*x))*_C1/cos(2*x)

simplify(my_sol,size);
odetest(%,ode);

y(x) = ((2*x+sin(2*x))/(cos(2*x)*(1/cos(2*x)^2)^(1/2))+_C1)*(1+tan(2*x)^2)^(1/2)

0

simplify(cos(2*x)*sqrt(1/cos(2*x)^2))

csgn(1/cos(2*x))

 

 

Download 072519.mw

 

 

Most of the time, odetest() returns just zero if solution satisfies ode, and non-zero expression if solution does not satisfy ode.

So I was just checking for zero as return value to check if my solution was verified or not. This works for most cases.

But there are cases when odetest returns odetest/PIECEWISE` where some cases are zero and some are not.  Example is below.

For this, I still want to consider my solution as valid if one of the cases in piecwise is zero. But I am not sure what is a robust way to do this in code. Currently, I do the following

restart;
ode:=x*diff(y(x),x) = y(x)+2*(x*y(x))^(1/2);
my_sol:=y(x)=x*(ln(x/_C1)^2 - 1) - 2*(-1 + sqrt(ln(x/_C1)^2))*x;
res:=odetest(my_sol,ode);
if res<>0 then
   if type(res,'function') then #this meant to handle PIECWISE                      
      print("verified");
   else
      print("did not verify");
   fi;
else #if we come here, res=0, so I am sure it is valid.
   print("verified");
fi;

In the above, the check  type(res,'function')  is meant to catch PIECEWISE  return, since when I did type(res) Maple told me the type is function.

But I am not sure if this is a robust way to check for this, as it might be possible maple will return non zero, and also a function, but it will not be what I think it is (i.e. PIECEWISE) and then I would flag my solution as valid when it is not.

worksheet attached also.


 

restart;
ode:=x*diff(y(x),x) = y(x)+2*(x*y(x))^(1/2);
my_sol:=y(x)=x*(ln(x/_C1)^2 - 1) - 2*(-1 + sqrt(ln(x/_C1)^2))*x;
res:=odetest(my_sol,ode);
if res<>0 then
   if type(res,'function') then
      print("verified");
   else
      print("did not verify");
   fi;
else
   print("verified");
fi;

ode := x*(diff(y(x), x)) = y(x)+2*sqrt(x*y(x))

my_sol := y(x) = x*(ln(x/_C1)^2-1)-(2*(-1+sqrt(ln(x/_C1)^2)))*x

`odetest/PIECEWISE`([0, x/exp((-x+(x*y(x))^(1/2))/x) = _C1], [0, x/exp((x+(x*y(x))^(1/2))/x) = _C1], [-4*(-x^2*(-ln(x/_C1)^2+2*(ln(x/_C1)^2)^(1/2)-1))^(1/2), x/exp(-(-x+(x*y(x))^(1/2))/x) = _C1], [-4*(-x^2*(-ln(x/_C1)^2+2*(ln(x/_C1)^2)^(1/2)-1))^(1/2), x/exp(-(x+(x*y(x))^(1/2))/x) = _C1])

"verified"

 

 

Download how_to_check_odetest.mw

I use patmatch to look for certain expression inside a larger expression.

I find sometimes I need to repeat the same code to check for  "... + ..."   and also ".... * .....", since I do not know to tell Maple to look for + or * in the same code. *Luckily, I do not have to check for "-" or "/" operators, since "+" match with "-" and "*" match with "/").

An example will make things more clear.

Suppose I want to see if sin(x)*sqrt(x*y) has sqrt(x*y) anywhere in it. So I first try

restart;
expr:= sin(x)*sqrt(x*y);
if patmatch(expr,a::anything+(b::anything*x*y)^(c::anything),'la') then
    assign(la);
    if c =1/2 or c=-1/2 then
       print("found sqrt(x*y)");
    else
       print("did not find sqrt(x*y)");
    fi;
 else
   print("did not find sqrt(x*y)");
 fi;

And this fails, since I used "+" inside the patmatch. Then I try '*" instead

if patmatch(expr,a::anything*(b::anything*x*y)^(c::anything),'la') then

And now it does match.

What I'd like to write, is something like this (which ofcourse does not work)

if patmatch(expr,a::anything (* or +) (b::anything*x*y)^(c::anything),'la') then

I looked at conditional in patmatch, but it does not seem to apply for the above.

Any suggestions?

Maple 2019.1 on windows 10

 

most people who post here seem to use .mw written in 2D, which I do not like to use.

Is there a tool to convert such a file to 1D worksheet that one can use from the command line before opening the document itself in Maple?

The reason I ask, sometimes opening the original file and trying to do this from inside Maple by selecting the code using the mouse, then  Format->ConvertTo->1D   does not work, and gives an error.

Also, sometimes, when I try to first create an empty worksheet document, and then try to copy/paste the code from the other document over, it also does not work. This happens when there are syntax errors in the original document. The error that comes up is

        Parse:-ConvertTo1D, "first argument to _Inert_ASSIGN must be assignable"

As an example, please see the attached file in the following question

https://www.mapleprimes.com/questions/227506--I-Need-Help-Trying-To-Write-A-Code

It will good to have a tool that converts such documents to 1D worksheet or even plain Maple code (.mpl) but I did not see such option under SAVE AS either. Also, when I tried to export it as .mpl file, I get the same error as above in the file. So I gave up.

 

I wanted to remove entry from a list that contain y=y or x=x in it. Here is an example

f:= (x-1)*y^4/(x^2*(2*y^2-1));
S:=[singular(f)]

Where I wanted to remove those entries highlighted above to obtain

This is below how I ended up doing it. I'd like to ask if there is a better or more elegent way. I had to use map, since could not get remove() to work on the original list in one shot. 

foo:= z->remove(has,z,{y = y,x = x});
map(foo,[singular(f)])

Which gives the output above.

Is there a better way to do this? I always learn when I find how to do something better.

Maple 2019.1

 

 

First 104 105 106 107 108 109 110 Last Page 106 of 164