nm

11438 Reputation

20 Badges

13 years, 75 days

MaplePrimes Activity


These are questions asked by nm

I want to match   a*x^b only if "a" and "b" are both not the symbol "y"

Therefore 5*x^y should fail to match, but this below matches.

restart;
expr:=5*x^y;
if patmatch(expr,conditional(a::anything*x^(b::anything),(a<>y and b<>y)),'la') then
   print("it matched, why??");
   map(assign,la):
   print("a = ",a, " b=",b);
fi;

it gives

                      "it matched, why??"
                      "a = ", 5, " b=", y

What did I do wrong? is my conditional wrong above?

 

In Maple this works

my_list :=[1,2,3];
my_list[1]:=0;

But this does not

my_set:={1,2,3};
my_set[1]:=0;

gives error "Error, cannot reassign the entries in a set". I suppose it has to do with the fact that sets, mathematically speaking, do not have an "oder" per say? But the elements must be ordered internally as they show, right? So the first element in the set is "1" and the second element in the set is "2", etc...

Had to use the ugly and unatural notation of

my_set := subsop(1=0, my_set)

To change the element of a set. The above implifies an order as well. So why the first did not work, but the above works?

The question is why is this inconsistency of notation?   It is much more natural to write "A[i]:=something". 

If using "subsop(1=0, my_set)" is a must for some reason, then why Can't Maple make a short cut, where if a user types "A[i]:=something" where A is a "set", then it will internally get modified/replaced by "A:=subsop(i=something, A)", so that one can still use the more natural syntax instead?

But it would be better just removing this restriction of using A[i]:=something on a set.

in this ODE, with initial conditions, I am trying to verify my solution, but I can't figure how Maple obtained the final answer.  I can obtain same solution, but before using the initial conditions to find the constant of integrations. The problem comes in solving for the constant of integration from initial conditions. I do not know how Maple did it, becuause when I do the normal steps, I get division by zero.

restart;
ode:=diff(y(x),x)=x*ln(y(x)):
ic:=y(1)=1:
sol:=dsolve({ode,ic},y(x));

gives "sol := y(x) = 1"

Now I solve without IC, then try to find _C1 by hand

sol:=dsolve(ode,y(x));

       sol := y(x) = exp(RootOf(x^2+2*Ei(1, -_Z)+2*_C1))

Now used remove_RootOf

sol2:=DEtools:-remove_RootOf(sol);

            sol2 := x^2+2*Ei(1, -ln(y(x)))+2*_C1 = 0

Now I followed the steps I learned at school, which is to plugin y=1 and x=1 in the solution to get an equation to solve for _C1

eq := subs({y(x)=1,x=1},sol2);

            eq := 1+2*Ei(1, -ln(1))+2*_C1 = 0

But Ei(1, -ln(1)) is a division by zero. So can't solve for _C1

solve(eq,_C1);
       Error, (in Ei) numeric exception: division by zero

So how would you solve for _C1 in the above? Or how did the smart Maple do it?

I tried using limits, but that did not help.  I tried using allvalues instead of remove_RootOf, and that did not get rid of RootOf.  Next I tried not to remove RootOf and keep it there to see what happens

sol:=dsolve(ode,y(x));
eq := subs({y(x)=1,x=1},sol);
             eq := 1 = exp(RootOf(1+2*Ei(1, -_Z)+2*_C1))

c1:=solve(eq,_C1, AllSolutions);
              c1 := -1/2-Ei(1, -(2*I)*Pi*_Z1)

subs(_C1=c1,sol);
             y(x) = exp(RootOf(x^2+2*Ei(1, -_Z)-1-2*Ei(1, -(2*I)*Pi*_Z1)))

simplify(%);
            x^2+2*Ei(1, -ln(y(x)))-1-2*Ei(1, -(2*I)*Pi*_Z1) = 0

DEtools:-remove_RootOf(%);
           x^2+2*Ei(1, -ln(y(x)))-1-2*Ei(1, -(2*I)*Pi*_Z1) = 0

solve(%,y(x));
          exp(RootOf(x^2+2*Ei(1, -_Z)-1-2*Ei(1, -(2*I)*Pi*_Z1)))

So I can't figure how Maple obtained y(x)=1. Maple must have used different method to solve for _C1.

What would be the Maple commands to use to obtain y(x)=1, starting from

            sol:=dsolve(ode,y(x));

and given that y(1)=1 ?

 

Can someone please explain in simple terms, why when I do

 r:=foo(r), where "r" is a Record, then the returned  "r" is not what is returned from foo()?  I want to write a proc foo() which takes in a Record variable, update some of its fields, and then return the updated Record to the caller

r:=Record('a','b');
foo:=proc(r)
    r:-b:=5;
    return(r);
end proc;

But now when I call the above as follows

r:-b:=99;
print(r);
r:=foo(r):
print(r);

The last print above just prints "r" and not the Record. It seems to have erased the Record.

 

But it works, if I change the name of the variable to return the result into, as 

r:-b:=99;
print(r);
r0:=foo(r):
print(r0);

When I do the same on say a Matrix, there is no problem

restart;
r:=<<1,1>>:
foo:=proc(r)
    r[1]:=5;
    return(r);
end proc;

And now

r;
r:=foo(r):
print(r);

 

Why it worked with a Matrix but not with Record? Why can't one overwrite the Record on the call return?

What would be the correct way to pass in a Record to a function, and have the function update some of its fields, and then return back the updated copy of the Record without having to make a new variable "r0" as above?

I really like Maple Record. I think it is one of the hidden gems in Maple. Very useful.

But I have basic questions on it. I just started to learn how to use it. It is very similar to Pascal Record.

1)

r:=Record(a,b);
                       r := Record(a, b)
type(r,'record');
                              true
whattype(r);
                             symbol

Why  type(r,'record') says true, but whattype(r) says symbol?

2)
Why Maple displays the record content to the screen automatically only first time, after it is created, but second time, it only echos the name? So one has to use print() each time to display the content of the record.  Not a big deal, but it is little annoying

r:=Record(a,b);
                       r := Record(a, b)
r;
                               r

print(r);
                          Record(a, b)

r:-a:=5;
                             a := 5
r
                               r

print(r);
                        Record(a = 5, b)

 

Compare this to say a set type, where it displays the content each time

r:={1,2,3};
                         r := {1, 2, 3}
r
                           {1, 2, 3}

I tried changing max_record_depth but I must be doing something wrong. It still does not display the content

interface(max_record_depth=10)
                               10
r:=Record(a,b);
                       r := Record(a, b)
r;
                               r

3) Why are these two behave the same way

r:=Record("y");
r:-y:=4;

r:=Record('y');
r:-y:=4;

Giving the name of the field as string worked the same way as second example which is a name.  I thought the first one above will not work as field name should be a name according to help.

First 156 157 158 159 160 161 162 Last Page 158 of 201