nm

8552 Reputation

19 Badges

12 years, 353 days

MaplePrimes Activity


These are replies submitted by nm

@Joe Riel 

thanks. This works. So the idea is to export it, but add protection on it to prevent it being changed.  Here is following your example using 2 fields. I removed the ModuleCopy function for now

restart;
person_class := module()
   option object;

    export name;
    export age;

    export ModuleCopy::static := proc(self:: person_class, proto::person_class) 
        protect('self:-name');
        protect('self:-age');
    end proc;

   export set_name::static:=proc(self::person_class, val);
      unprotect('self:-name');
      self:-name := val;
      protect('self:-name');
      val;
   end proc;

   export set_age::static:=proc(self::person_class, val);
      unprotect('self:-age');
      self:-age := val;
      protect('self:-age');
      val;
   end proc;

   export foo::static:=proc(self::person_class)
       self:-name:="new name";
   end proc;

   #add these also at end of class
   protect('name');
   protect('age');

end module:

And now

p:=Object(person_class);
p:-set_name(p,"me"):
p:-name:="new name";  #gives error since protected. Good.
p:-name;  #reads name OK
p:-set_age(p,100):
p:-age;  #reads age OK

 

@Joe Riel 

Thanks, but I do not see how this would work. From help it says 

When declaring an object the members must be declared as either local to the object, using a local declaration or exported, using an export declaration.  A member that is declared local can only be accessed from the object's methods, or other object's methods of the same class.  A member that is exported can be accessed anywhere.

which I understood it to mean that local variables for object are private. And when I tried it, it confirms the above

restart;
module my_class()
  option object;

  local name::string;
 
  export set_name::static:=proc(o::my_class,name::string)
     o:-name := name;
  end proc;

end module;

And now

o:=Object(my_class);
o:-name;

gives an error

Error, module `my_class` does not export `name`
 

May be I am missing something from what you are saying. I do not understand.

@Carl Love 

fyi, In the .mw posted, it says

     Now I am trying to achieve a general expression by substituting j for 6

so OP was trying to replace number by a symbol j, that is why they were getting an error,  They had it working for an integer, but were trying to use symbol for j.

At least this is what I understood by looking at their code.

If you look at help for combinat:-numbcomb(n,m) it says first argument must be a set or a list or a non-negative integer.

Therefore, what would you expect the output of 

restart:
i:=4;
combinat:-numbcomb(j+i,i+1)

to give?  Since now the first argument which is j+4  is none of the allowed first arguments.

It is not a list, and not a set and not a non-negative integer.

@acer 

Thanks, it worked. 

   "And inside your procedure the local ode gets only 1-level evaluation."

This explains why

               ode := :-parse("diff(y(x),x$2)=0"): 

works, but inside a proc, one must do 

               ode := eval(:-parse("diff(y(x),x$2)=0")):

I had no idea that semantics of assignment to local variable is different than assignment to the variable when in global context before.

I thought the LHS name gets assigned whatever the value of the RHS, regadless if variable is inside a proc or not. But it seems this is not the case. Maple evaluation rules seems more complicated than I first thought. I need to look more into this.

@ecterrab 

Thanks. I knew about your papers and I've just started studying the first one. But I have a small question if I may.

In the Maple help,

https://fr.maplesoft.com/support/help/Maple/view.aspx?path=odeadvisor/Abel 

It says if Abel ODE has f2=0, and the Abel invariant do not depend on , then the ODE can be solved directly.

But how directly? Since it is still Abel ODE. For example, Kamke #38 has f2=0 and constant invariant:

ODE:=-a*y(x)^3-b/x^(3/2)+diff(y(x),x)=0; #kamke 38


Which has, by comparing the above to y'=f0+f1*y+f2*y^2+f3*y^3 the following

f0:=b/x^(3/2);
f1:=0;
f2:=0;
f3:=a;
DEtools:-odeadvisor(ODE);

[[_homogeneous, `class G`], _rational, _Abel]

And so the Abel invariant is 

f0:=b/x^(3/2); 
f1:=0; 
f2:=0; 
f3:=a; 
inv:=-(-diff(f0, x)*f3 + f0*diff(f3, x) + 3*f0*f3*f1)^3/(27*f3^4*f0^5)

So we see the invariant does not depend on x. But now what? How to solve the ODE "directly". This is the part I am missing. Since it is the same ODE, i.e. Abel. Nothing changed.  

Is there some additional transformation needed? The transformation mentioned in the help, is when f2<>0, in order to eliminate f2. But this is not the case here.

What is it I am missing here? 

thanks

@Joe Riel 

Ok, So what is the internal representation of 1/z ? would that not be z^(-1)? If so, then why subs(z=t,1/z); worked, since there is no term in the expression, there is only z^(-1)?

What would you recommend then to replace (x*y) in the expression 1/(x*y) with some other value such as which would also work if (x*y) was in the numerator or in the denominator?

 

@Joe Riel 

"Something I'd like to see is object inheritance."

Maplesoft seems to have limited resources and is a small company compared to the competition.

Therefore It would be much better if it uses these resources on things that are much more useful  and practical than adding inheritance and multiple inheritance, which might end up being used by very few people to do CAS programming. 

Improving the debugger for example, will be much much more useful to many more people as well as improving the Latex export. These things are used by many people all the time.

Maplesoft should also concentrate its resources more on core Mathematics and less of fancy features trying to follow the competition.

I'd rather see Maplesoft use its limited and important resources to make Maple solve more PDE's, ODE's, equations and integrals for example. (in addition to improving the debugger and Latex). 

I have not even mentioned the robustness of the software. Maple hangs on me each day may be 2-3 times whenever I run a long computational script, and at random locations, due to memory issues it seems in mserver.exe.

It seems to me that doing stress tests on Maple to fix such problems is much more important use of your resources.

 

 

@Carl Love 

yes, great answer as usual. I've been busy and now got to try it and it works very well. thanks.

 

could these be build-into Maple, as an extra option to plot command, called 'plot_theme' or such? 

Mathematica has this option, they call it `PlotTheme` https://reference.wolfram.com/language/ref/PlotTheme.html  and one can select many themes. 

It will be good to have such functionality as part of Maple's plot command as well.

@Carl Love 

May be we are using different Maple versions?
 

restart;

interface(version)

`Standard Worksheet Interface, Maple 2020.1, Windows 10, June 10 2020 Build ID 1474787`

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

y(x) = -arctan(-x+_C1)*x+arctan(-x+_C1)*_C1-(1/2)*ln(1+(x-_C1)^2)

simplify(my_sol)

y(x) = -(1/2)*ln(_C1^2-2*_C1*x+x^2+1)+(1/2)*(-2*x+2*_C1)*arctan(-x+_C1)

 


 

Download check_3.mw

@ecterrab 

Thank you very much for this nice hint. I had no idea one could do this in Maple. This is very useful and I will use it more now.

I think this ODE comes from the book "Ordinary differential equations and their solutions. By George Moseley Murphy. 1960". 

Actually the solution I got, before simplifying it is very close to Maple's

 

I used Maple to help with integration and simplification of expressions during solving it.

thanks again. Attached PDF if needed.

 

foo3.pdf

 

@vv 

opps, sorry about that. I was not trying to confuse any one. I confused myself, since I copied the data into a Matrix() and did not notice that <<|>> notation and Matrix([]) do not geneate the same matrix, but the transpose of it. That is why.

Thanks for pointing that out. 

I do not like to use << | >> notation in Maple, and prefer to use Matrix( [] ), that is all.

 

@rameen hamood 

are you sure you copied it right? it says

let A=<< 87, -66, -90, 12, 48>|<-36, -40, -82, -54, 15>|<99, 79, 76, -31, 27>|<-69, 15, -10, 45, -9>>

and x= <9,-4,2,-17>.

But A is 4 by 5, and x is (if you look at it as column vector) is 4 by 1. So inner dimensions do not match. Even if you look at x as row vector, it is 1 by 4, and inner dimensions do not match either.

But if you view x as matrix, then x.A works, like this

 

restart;
A:=Matrix([ [87, -66, -90, 12, 48],[-36, -40, -82, -54, 15],[99, 79, 76, -31, 27],[-69, 15, -10, 45, -9]]);
x:=Matrix([9,-4,2,-17]);
TA:=x.A

which gives

         [2298, -531, -160, -503, 579]

Do not know if this is what being asked.

 

 

is what you asking how to multiply a matrix by a vector in Maple?

First 33 34 35 36 37 38 39 Last Page 35 of 71