## 13613 Reputation

19 years, 253 days

## An example...

@soechristian Here is a simple example.

sys:={y=x^2-1,y=x};
res:=solve(sys,{x,y},explicit);

#This is just an example of the use of evaluating some expression at res[1] or res[2]:

expand(eval(x^2+y^2-1,res[1]));
expand(eval(x^2+y^2-1,res[2]));

#Now actually assigning
assign(res[1]);
x,y;

res[1] refers to the first result in the sequence res.

## Use coords=polar etc....

@hirnyk For some functions coords = polar makes the pictures look nice:

plots:-conformal(z,z=0..1+Pi*I,numxy=[20,100],grid=[10,25],coords=polar,scaling=constrained,caption="The z-plane"):

plots:-conformal(sec(z),z=0..1+Pi*I,numxy=[20,100],grid=[10,25],coords=polar,scaling=constrained,caption="The w-plane"):

plots:-display(Array([%%,%]));

## Use coords=polar etc....

@hirnyk For some functions coords = polar makes the pictures look nice:

plots:-conformal(z,z=0..1+Pi*I,numxy=[20,100],grid=[10,25],coords=polar,scaling=constrained,caption="The z-plane"):

plots:-conformal(sec(z),z=0..1+Pi*I,numxy=[20,100],grid=[10,25],coords=polar,scaling=constrained,caption="The w-plane"):

plots:-display(Array([%%,%]));

## Could replace `` with anything else...

@Orion Is it going to help any to replace ``  with f (assuming that f doesn't evaluate to anything but its own name)? As in

eval(p2(u),``=f);

At least you only get a warning when doing

CodeGeneration:-Fortran(eval(p2(u),``=f));

You would have to remove f all over the place though. But that could be done in a text editor with Edit/replace.

## Could replace `` with anything else...

@Orion Is it going to help any to replace ``  with f (assuming that f doesn't evaluate to anything but its own name)? As in

eval(p2(u),``=f);

At least you only get a warning when doing

CodeGeneration:-Fortran(eval(p2(u),``=f));

You would have to remove f all over the place though. But that could be done in a text editor with Edit/replace.

## Extension to arbitrary integral powers...

Extending the above procedure to arbitrary integral powers:

CombineLikePowers:=proc(u::algebraic,L::{posint,set(posint),list(posint)}:=infinity) local S0,S,k,u0,u1,u2,u3,u4;
if type(u,`+`) then
map(procname,u,L)
elif type(u,`*`) then
u0:=evalindets(u,function,freeze);
if not member(true,map(type,{op(u0)},{name^posint,name^negint})) then return u end if;
S0:=map(abs,map2(op,2,indets(u0,`^`(anything,integer)))) minus {1};
﻿       if L=infinity then
S:=S0
elif type(L,posint) then
S:={L} intersect S0
else
S:=convert(L,set) intersect S0
end if;
for k in S do
u1:=evalindets(u0,{algebraic^k,algebraic^(-k)},x->``(root[k](x,symbolic)));
u2,u3:=selectremove(type,u1,specfunc(algebraic,``));
u4:=``(eval(u2,``=(()->args)))^k*u3;
u0:=evalindets(u4,specfunc({name,`^`},``),expand);
end do;
thaw(u0)
else
u
end if
end proc;

You may try it on something like

w:=expand(randpoly([x,y,sin(x^2)],degree=4,dense)/a^4/b^3);

You could do

CombineLikePowers(w);

or if you only want powers 2 and 3:

CombineLikePowers(w,{2,3});

## Extension to arbitrary integral powers...

Extending the above procedure to arbitrary integral powers:

CombineLikePowers:=proc(u::algebraic,L::{posint,set(posint),list(posint)}:=infinity) local S0,S,k,u0,u1,u2,u3,u4;
if type(u,`+`) then
map(procname,u,L)
elif type(u,`*`) then
u0:=evalindets(u,function,freeze);
if not member(true,map(type,{op(u0)},{name^posint,name^negint})) then return u end if;
S0:=map(abs,map2(op,2,indets(u0,`^`(anything,integer)))) minus {1};
﻿       if L=infinity then
S:=S0
elif type(L,posint) then
S:={L} intersect S0
else
S:=convert(L,set) intersect S0
end if;
for k in S do
u1:=evalindets(u0,{algebraic^k,algebraic^(-k)},x->``(root[k](x,symbolic)));
u2,u3:=selectremove(type,u1,specfunc(algebraic,``));
u4:=``(eval(u2,``=(()->args)))^k*u3;
u0:=evalindets(u4,specfunc({name,`^`},``),expand);
end do;
thaw(u0)
else
u
end if
end proc;

You may try it on something like

w:=expand(randpoly([x,y,sin(x^2)],degree=4,dense)/a^4/b^3);

You could do

CombineLikePowers(w);

or if you only want powers 2 and 3:

CombineLikePowers(w,{2,3});

## Missing the point...

@Alex Smith You are missing the point, which (as I understod it) was to integrate term by term, which is NOT done when you do

value(Int((sum(x^(2*k+1), k = 1 .. infinity))*sqrt(1-x), x = 0 .. 1));

because

Int((sum(x^(2*k+1), k = 1 .. infinity))*sqrt(1-x), x = 0 .. 1);

is not the integral of an infinite sum as I pointed out in my answer above (In the remark: "This is not really an infinite summation example since Maple first computes the sum").

## Missing the point...

@Alex Smith You are missing the point, which (as I understod it) was to integrate term by term, which is NOT done when you do

value(Int((sum(x^(2*k+1), k = 1 .. infinity))*sqrt(1-x), x = 0 .. 1));

because

Int((sum(x^(2*k+1), k = 1 .. infinity))*sqrt(1-x), x = 0 .. 1);

is not the integral of an infinite sum as I pointed out in my answer above (In the remark: "This is not really an infinite summation example since Maple first computes the sum").

## evalf/Meijer...

@hirnyk You are quite right. Something seems to suggest that the exact answer is correct, but the numerical evaluation of it is rather sensitive to the value of Digits. According to Maple the sum

sum(int(x^(2*k+1)*sqrt(1-x), x = 0 .. 1), k = 1 .. infinity);

has the value

(1/8)*sqrt(Pi)*sqrt(2)*MeijerG([[1], [11/4, 13/4]], [[5/2, 2, 1], []], -1)

If you do

evalf(sum(int(x^(2*k+1)*sqrt(1-x), x = 0 .. 1), k = 1 .. infinity),6);

you are using Digits = 6 (regardless of the value of Digits).

Interestingly, you get a better (and roughly correct) result than if you Digits = 10 or 20 (in the latter case the result is 4.0448194072012987198*10^11-3.4793277886925613872*10^10*I, which obviously is far off.

## evalf/Meijer...

@hirnyk You are quite right. Something seems to suggest that the exact answer is correct, but the numerical evaluation of it is rather sensitive to the value of Digits. According to Maple the sum

sum(int(x^(2*k+1)*sqrt(1-x), x = 0 .. 1), k = 1 .. infinity);

has the value

(1/8)*sqrt(Pi)*sqrt(2)*MeijerG([[1], [11/4, 13/4]], [[5/2, 2, 1], []], -1)

If you do

evalf(sum(int(x^(2*k+1)*sqrt(1-x), x = 0 .. 1), k = 1 .. infinity),6);

you are using Digits = 6 (regardless of the value of Digits).

Interestingly, you get a better (and roughly correct) result than if you Digits = 10 or 20 (in the latter case the result is 4.0448194072012987198*10^11-3.4793277886925613872*10^10*I, which obviously is far off.

## Another quick fix...

@hirnyk Thanks for the example. Luckily I titled my answer "A quick fix" and ended with "I am not necessarily saying that it would be a good idea in general, though."

My point was to call attention to the last line in the procedure 'discont', which in its entirety reads like this:

showstat(discont);

discont := proc(f::algebraic, x::name)
local disr, disc;
1   if nargs <> 2 then
2     error "exactly 2 arguments expected (f::algebraic,x::name)"
end if;
3   _EnvAllSolutions := true;
4   disr := traperror(`discont/discontR`(f,x));
5   if disr = lasterror then
6     error "cannot determine discontinuities"
end if;
7   disc := traperror(`discont/discontC`(f,x));
8   if disc = lasterror then
9     error "cannot determine discontinuities"
end if;
10   disc := `discont/RootOf`(`discont/RemoveIm`(`discont/duplicates`(`union`(disr,disc))));
11   remove(type,disc,nonreal)
end proc

Another quick fix (definitely not a good idea in general) is to replace line 3 with _EnvAllSolutions := false;

which can be done by

Discont:=subs(true=false,eval(discont));

This will handle both f and g, but would destroy discont(1/sin(x),x);

## Another quick fix...

@hirnyk Thanks for the example. Luckily I titled my answer "A quick fix" and ended with "I am not necessarily saying that it would be a good idea in general, though."

My point was to call attention to the last line in the procedure 'discont', which in its entirety reads like this:

showstat(discont);

discont := proc(f::algebraic, x::name)
local disr, disc;
1   if nargs <> 2 then
2     error "exactly 2 arguments expected (f::algebraic,x::name)"
end if;
3   _EnvAllSolutions := true;
4   disr := traperror(`discont/discontR`(f,x));
5   if disr = lasterror then
6     error "cannot determine discontinuities"
end if;
7   disc := traperror(`discont/discontC`(f,x));
8   if disc = lasterror then
9     error "cannot determine discontinuities"
end if;
10   disc := `discont/RootOf`(`discont/RemoveIm`(`discont/duplicates`(`union`(disr,disc))));
11   remove(type,disc,nonreal)
end proc

Another quick fix (definitely not a good idea in general) is to replace line 3 with _EnvAllSolutions := false;

which can be done by

Discont:=subs(true=false,eval(discont));

This will handle both f and g, but would destroy discont(1/sin(x),x);

## New in Maple 9...

@Ratch The Java based interface came with Maple 9. And I believe the 2D-input was introduced at the same time (not earlier for sure). Then Maple 9.5, 10, 11, 12, 13, and now 14. So that amounts to 7 levels.

## New in Maple 9...

@Ratch The Java based interface came with Maple 9. And I believe the 2D-input was introduced at the same time (not earlier for sure). Then Maple 9.5, 10, 11, 12, 13, and now 14. So that amounts to 7 levels.

 First 217 218 219 220 221 222 223 Last Page 219 of 229
﻿