nm

8552 Reputation

19 Badges

12 years, 348 days

MaplePrimes Activity


These are questions asked by nm

May be someone could help me understand the logic that Maple goes through in this example.

restart;
ode:=diff(y(x), x) = sqrt(y(x))*sin(x);
dsolve([ode,y(0)=0]);
dsolve([ode,y(0)=0],'implicit');

For first dsolve it returns y(x)=0 and for the second it returns what is expected which is sqrt(y(x)) + cos(x)/2 - 1/2 = 0

Why this difference in result? Just trying to understand the logic behaind it. 

Maple 2023.1 on windows 10

``

restart;

ode:=diff(y(x), x) = sqrt(y(x))*sin(x);
dsolve([ode,y(0)=0]);
dsolve([ode,y(0)=0],'implicit');

diff(y(x), x) = y(x)^(1/2)*sin(x)

y(x) = 0

y(x)^(1/2)+(1/2)*cos(x)-1/2 = 0

 

Download why_dsolve.mw

This setup works, where B extends A, then B method access local variable in A directly, since it now becomes part of the object B itself

restart;
                            
module A()
  option object;
  local s::string:="";
end module;

module B()
   option object(A);
   export foo::static:=proc(_self,$)
      _self:-s := cat(_self:-s,"something");
      print(_self:-s);
   end proc:
end module;

o:=Object(B);
o:-foo()

Gives "something"

Now, I changed B, by adding an anonymous local proc() and did the same exact thing as above, which is to access s.

Now Maple complains that B does not export s

restart;

module A()
  option object;
  local s::string:="";
end module;

module B()
   option object(A);
   export foo::static:=proc(_self,$)
        proc()
            _self:-s:=cat(_self:-s,"somethig");
            print(_self:-s);
        end proc();
   end proc:
end module;

o:=Object(B);
o:-foo()

It gives

Error, (in anonymous procedure called from anonymous procedure) module `B` does not export `s`

Could someone help me understand why this happens? How it works in the first example but not in the second?  I do not see why it would make difference. isn't anonymous procedure part of the class that is being extended?

Update

It is worst than I thought. Even named local proc, inside method now fail. Here is an example

restart;

module A()
  option object;
  local s::string:="";
end module;

module B()
   option object(A);
   export foo::static:=proc(_self,$)
        local z::string:="something";
        local my_inner_proc:=proc()
            _self:-s:=cat(_self:-s,z);
        end proc();
        my_inner_proc();
   end proc:
end module;

o:=Object(B);
o:-foo()

Gives 

Error, (in anonymous procedure called from anonymous procedure) module `B` does not export `s`
I was using code which worked before, but now after extending the class, I am finding all these problems.

Is this documented something that local proc()'s inside method do not work as expected when extending classes in Maple OOP? It means now I have to move these local proc() to the outside of its current enclosing proc() to make Maple happy.  I just do not understand why this limitation.

Maple 2023.1 on Windows 10

integral of sqrt(sin(x)) is known to be as given in few place such as in here and other places.

Maple gives a result which is much more complicated (but also in terms of EllipticE special function). 

Could someone find a way to simplify it to the above answer and also to the same answer given by Mathematica?

int(sqrt(sin(x)),x)

Compare to 

Maple's result seems to be correct, as I plotted it and compared the smaller known resut. But I was not able to simplify it to obtain the smaller antiderivative.

Any tricks to do that?

Maple 2023.1 will not let me overload a method for an object when using _self.  Is there a way around this?

module person()
   option object;
   local the_name::string:="*",the_age;

   export set_info::static:= overload(
   [
      proc(_self,the_name::string,$) option overload;
          _self:-the_name:=the_name;
      end proc,

      proc(_self,the_name::string,the_age::integer, $) option overload;
          _self:-the_name:=the_name;
          _self:-the_age:=the_age;
      end proc
   ]);

   export get_name::static:=proc(_self,$)
      RETURN(_self:-the_name);
   end proc;
end module;

And now when I do 

o:=Object(person);
o:-set_info("me");
o:-set_info("me",20)

Error, (in person:-set_info) `me` does not evaluate to a module
Error, invalid input: no implementation of person:-set_info 
matches the arguments in call, 'person:-set_info("me",20)'

The problem goes away by removing `_self` as first argument in signature of the overloaded method. But then I will not be able to use _self any more inside the methods.

There is no problem overloading the method when using normal module, or one that does not use _self. For example this works

restart;

module person() 
   export set_info:= overload(
   [
      proc(the_name::string,$) option overload;
          print(the_name);
      end proc,

      proc(the_name::string,the_age::integer, $) option overload;
          print(the_name);
          print(the_age);
      end proc
   ]);
end module;

person:-set_info("me");
person:-set_info("me",20)

How to make the first example above work? I need to overload a method inside an module with option object that uses _self

update

I found a workaround. But it is not good, but for now. For the overloaded method, instead of using 
           o:-set_info("me");

This works instead

         set_info(o,"me");

So the following now works

o:=Object(person);

#o:-set_info("me");   #do not use with overloaded
#o:-set_info("me",20); #do not use with overloaded

set_info(o,"me");  #now works OK with no error
set_info(o,"me",20); #now works OK with no error

o:-get_name();  #OK since this method  is not overloaded
o:-get_age();  #OK since this method  is not overloaded

I do not understand why _self can't be used with overloaded methods and if this a bug or by design. 

Maple 2023.1 on windows 10

67588

interface(version);

`Standard Worksheet Interface, Maple 2023.1, Windows 10, July 7 2023 Build ID 1723669`

restart;

67588

module person()
   option object;
   local the_name::string:="*",the_age;

   export set_info::static:= overload(
   [
      proc(_self,the_name::string,$) option overload;
           #print("Inside first overloaded set_info");
          _self:-the_name:=the_name;
      end proc,

      proc(_self,the_name::string,the_age::integer, $) option overload;
          #print("Inside second overloaded set_info");
          _self:-the_name:=the_name;
          _self:-the_age:=the_age;
      end proc
   ]);

   export get_name::static:=proc(_self,$)
      RETURN(_self:-the_name);
   end proc;

   export get_age::static:=proc(_self,$)
      RETURN(_self:-the_age);
   end proc;
end module;

module person () local the_name::string, the_age; option object; end module

o:=Object(person);
#o:-set_info("me");
#o:-set_info("me",20);

set_info(o,"me"):
set_info(o,"me",20):

o:-get_name();
o:-get_age();

module person () local the_name::string, the_age; option object; end module

"me"

20

 

Download self_with_overloaded.mw

I found another big problem. 

In 2022, I get Error, (in SolveTools:-Polynomial) too many levels of recursion when using alias(seq(c[k] = _C||k, k = 0..10)); at the top of my code and the solution to the ode has c[2],c[3] etc.. as constants of integration.

This solution was given by Kitonum in this answer

I had this for years in the code (i.e. the alias) code.

In Maple 2022 the following gives the above exception error from odetest. I am using 2022, because in 2023 it just hangs on the same code.  

If I remove the alias code, no error shows. (solution is wrong, but that is different story). 

Also, If I remove the alias code, 2023 no long hangs!  

restart;

#kernelopts('assertlevel'=2):

alias(seq(c[k] = _C||k, k = 0..10));

c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10]

ode:=diff(diff(y(x),x),x)+4*diff(y(x),x)+12*y(x) = 80*sin(2*x);
sol:=y(x) = -10*exp(-1/2*2^(1/2)*arctan(sin(2*2^(1/2)*x)/cos(2*2^(1/2)*x)))*(c[3]*cos(2*2^(1/2)*x)+c[2]*sin(2*2^(1/2)*x))*((-1/10*exp(4*I*2^(1/2)*x)+1/10)*c[2]-1/10*I*c[3]*exp(4*I*2^(1/2)*x)-1/10*I*c[3])/((exp(4*I*2^(1/2)*x)-1)*c[2]+I*c[3]*exp(4*I*2^(1/2)*x)+I*c[3])*c[1]-10*I*exp(-1/2*2^(1/2)*arctan(sin(2*2^(1/2)*x)/cos(2*2^(1/2)*x)))*(c[3]*cos(2*2^(1/2)*x)+c[2]*sin(2*2^(1/2)*x))*(cos(2*x)-sin(2*x))*exp(2*I*2^(1/2)*x)*exp(2*I*2^(1/2)*x)^(-1/2*I*2^(1/2))/((exp(4*I*2^(1/2)*x)-1)*c[2]+I*c[3]*exp(4*I*2^(1/2)*x)+I*c[3]);

odetest(sol,ode);

diff(diff(y(x), x), x)+4*(diff(y(x), x))+12*y(x) = 80*sin(2*x)

y(x) = -10*exp(-(1/2)*2^(1/2)*arctan(sin(2*2^(1/2)*x)/cos(2*2^(1/2)*x)))*(c[3]*cos(2*2^(1/2)*x)+c[2]*sin(2*2^(1/2)*x))*((-(1/10)*exp((4*I)*2^(1/2)*x)+1/10)*c[2]-((1/10)*I)*c[3]*exp((4*I)*2^(1/2)*x)-((1/10)*I)*c[3])*c[1]/((exp((4*I)*2^(1/2)*x)-1)*c[2]+I*c[3]*exp((4*I)*2^(1/2)*x)+I*c[3])-(10*I)*exp(-(1/2)*2^(1/2)*arctan(sin(2*2^(1/2)*x)/cos(2*2^(1/2)*x)))*(c[3]*cos(2*2^(1/2)*x)+c[2]*sin(2*2^(1/2)*x))*(cos(2*x)-sin(2*x))*exp((2*I)*2^(1/2)*x)*(exp((2*I)*2^(1/2)*x))^(-((1/2)*I)*2^(1/2))/((exp((4*I)*2^(1/2)*x)-1)*c[2]+I*c[3]*exp((4*I)*2^(1/2)*x)+I*c[3])

Error, (in SolveTools:-Polynomial) too many levels of recursion

 

Download odetest_error_june_15_2023.mw

Why using the alias line above causes this error?  If you remove the alias line, you will see it completes with no error.

But it hangs in 2023. I am no longer using 2023 but went back to 2022 due to too many hangs in 2023. I wonder now if it because of this alias line I had there all the time.  I will remove now and see if this solves some of the hangs I had in 2023.

Anyone can shed some more light on what is going on?

Windows 10.

First 9 10 11 12 13 14 15 Last Page 11 of 164