Preben Alsholm

13743 Reputation

22 Badges

20 years, 341 days

MaplePrimes Activity


These are replies submitted by Preben Alsholm

Without trying to understand what is going on I notice that you are using equality signs where assignments should be used.

Example:  You have x=x+1; That surely should be x:=x+1;
There are many such errors.

But there are other errors.

How did you do this by hand? By separation of variables? How?

@THAPELO You need to give the parameters to dsolve in one way or the other:

1. By assigning to the parameters before using dsolve, as in b:=1;  etc.
Be aware though that 'gamma' is Euler's constant in Maple, so you won't be allowed to assign to gamma. You could just call it something else, like gamma1.

2. A better way (in my opinion) is to define a set of equations (not assignments):

params:={b=1, d=0.2, k=1, alpha=0.5, gamma=0.25, mu=0.3};

and then use   eval({sys1, sys2, sys3},params)  as your concrete system. This is what I do below.
Using gamma is OK here as you are not assigning to it.

3. If you experiment a lot with varying parameters you may want to use the option parameters in dsolve

dsolve( {...ivp...}, numeric, parameters=[b, d, k, alpha, gamma, mu]);

This needs some explaining, which I shall not do now, but can give you an example if you wish.

##
If some parameters are fixed during the whole session you could assign to those as in point 1 and then use method 2 or 3 for the rest.

##############
restart;
sys1:= diff(S1(t),t) = b - d*S1(t) - k*S1(t)*S2(t)/(1+ alpha*S1(t)) - gamma*S3(t);
sys2:= diff(S2(t),t) = k*S1(t)*S2(t)/(1+ alpha*S1(t)) - (d + mu)*S2(t);
sys3:= diff(S3(t),t) = mu*S2(t) - (d + gamma)*S3(t);
##Method 2:
params:={b=1, d=0.2, k=1, alpha=0.5, gamma=0.25, mu=0.3};

Sol1:=dsolve(eval({sys1, sys2, sys3},params) union {S1(0)=1.35, S2(0)=0.9, S3(0)=0.45}, numeric);

plots:-odeplot(Sol1,[[t,S1(t)],[t,S2(t)],[t,S3(t)]],0..25);
#Values at t=25:
Sol1(25);
##Equilibria:
solve(rhs~({sys1, sys2, sys3}),{S1(t),S2(t),S3(t)});
eval([%],params);
map(subs,%,[S1(t),S2(t),S3(t)]);




@mathsstudent93 Just one more observation:

If you impose boundary conditions for s and/or D[1](s) at both ends of the interval you seem to get a trustworthy solution also for your original setup.

@mathsstudent93 I don't have any idea about what is going on, but do have a couple of observations:

1. You are missing a multiplication sign in DS just after (C2+3000.0).
  This is not the problem though.

2. There are some large and small numbers in the problem. So I tried a very simple version where every coefficient appearing is 1.
The code used was:

restart;
DS := diff(s(x, t), t) = diff(s(x, t), x, x)+b(x, t)/(1+b(x, t))-s(x, t)-e(x, t);
DE := diff(e(x, t), t) = s(x, t)-e(x, t)-e(x, t)*r(x, t)+b(x, t);
DR := diff(r(x, t), t) = 1+b(x, t)/(1+b(x, t))-r(x, t)-e(x, t)*r(x, t)+b(x, t);
DB := diff(b(x, t), t) = -b(x, t)+e(x, t)*r(x, t);
sys := DS, DE, DR, DB:
ivp := e(x, 0) = 1, s(x, 0) = 1, r(x, 0) = 1, b(x, 0) = 1, D[1](s)(0, t) = 0, s(0, t) = 1;
pde := pdsolve({sys}, {ivp}, numeric, time = t, spacestep=0.1, range = 0 .. 1);
pde:-plot(b(x, t), t = 1);
pde:-animate(b,t=1);
pde:-animate(s,t=1);



#OK you do get something out of there, but try changing spacestep to 0.01.

I suggest giving us the equations (as text) including (of course) initial and boundary conditions.

Notice that the help page for pdsolve/numeric says

 "The first mode of operation uses the default method, which is a centered implicit scheme, and is capable of finding solutions for higher order PDE or PDE systems. The PDE systems must be sufficiently close to a standard form for the method to find the numerical solution.
- The second mode of operation is strictly educational, and allows specification of a particular method to solve a PDE. This mode is restricted to a single PDE."

Since you have a system of 4 pdes you don't have any choice.

@J4James I suppose you want Maple to solve the last example.

Here I assume that past history is y(z)=1 for z<=0. (I don't know a way of giving dsolve a non-constant history as things are now with an alpha-version).

restart;
dde:=diff(y(z),z)=1-a*y(z)*y(z-xi)^n/(1+y(z-xi)^n);
params:={a=5,xi=0.6,n=4};
res:=dsolve({eval(dde,params),y(0)=1},numeric,range=0..100);
plots:-odeplot(res,[z,y(z)],0..100,refine=1,size=[900,200]);

You can remove the range option from dsolve and consequently the refine option from odeplot if you like.


@ribragimov Sysq has to be what it is in your worksheet and what I have above because then everything but delta1 and u1 are known.
The reason for finding the second derivatives of u0 and delta0 (via EQS) is that in order to solve the system Sysq and Sysqq we need to differentiate Sysq since it is not a differential equation. This can be done either explicitly (as I do) or by dsolve which will use a DAE-method (see the help under dsolve,numeric).
Since the system doesn't know how to differentiate F,F1,Fdiff,F1diff it will complain, however.
Rather than defining differentiation rules for those functions, I chose to do the differentiation of Sysq myself. That is how Sysqdiff came about. Notice that it only has u1 and delta1 as unknowns. 

With Sysq and Sysqdiff dsolve won't have to use a DAE-method, but will just use the default rkf45-method.

@Lal You can use piecewise:

f:=x->piecewise(x<Pi,exp(x),x^(-2));
plot(f(x),x=0..2*Pi,discont=true);
a:=0: b:=2*Pi: p:=b-a:
fp:=f(x-floor( (x-a)/p)*p);
plot(fp,x=-4*Pi..4*Pi,discont=true);


@Lal p is just the length of the interval a..b. The code is written so it can be used for any function h defined on a..b.

The argument  x-floor( (x-a)/p)*p) will lie in the interval a..b for any real x. To be precise it will lie in the half-open interval [a,b).
Try
plot(x-floor( (x-a)/p)*p,x=-4*Pi..4*Pi,scaling=constrained,discont=true);

You may also want to look at the help page for floor:
?floor

@sssMMM To continue where I left off after having defined Fdiff and F1diff I did:

Sysq := ((9/10)*F1(x)*F(x)*F1diff(x)-(3/10)*Fdiff(x)*F1(x)*F1(x)+(3/2)*F1(x))*F(x) = (1/5)*F(x)*delta1(x)-(3/10)*u1(x);
Sysqq := u1(x)*Fdiff(x)+F1(x)*(diff(delta1(x), x))+delta1(x)*F1diff(x)+F(x)*(diff(u1(x), x)) = 0;

sbs1:={diff(u0(x),x)=F1diff(x),diff(delta0(x),x)=Fdiff(x),delta0(x)=F(x),u0(x)=F1(x)};
Fdiff2:=unapply(subs(diff(EQS,x),sbs1,diff(delta0(x),x,x)),x,numeric);
F1diff2:=unapply(subs(diff(EQS,x),sbs1,diff(u0(x),x,x)),x,numeric);

sbs2:={diff(F(x),x)=Fdiff(x),diff(F1(x),x)=F1diff(x),diff(Fdiff(x),x)=Fdiff2(x),diff(F1diff(x),x)=F1diff2(x)};
Sysqdiff:=subs(sbs2,diff(Sysq,x));

sol:=dsolve({Sysqdiff,Sysqq,delta1(0) = 10^(-8), u1(0) = 10^(-8)},numeric,known=[F,F1,Fdiff,F1diff,Fdiff2,F1diff2]);
odeplot(sol,[[x,u1(x)],[x,delta1(x)]],0..10);




@J4James I think that Allan Wittkopf's second reply answers that completely.

What is in that html file you have at the bottom? I cannot access it.

Try again, but this time after a restart.
Thus do

restart;
int(x^2+3*x, x);

@J4James Your headline is "Method of Steps" and the content is "I'm wondering maybe Maple can still handle DDEs with a Proc.".

I fail to understand your question.

############
Do you mean:
How does the procedure (when using procedural input) have to look for a delay differential equation if it is at all available to the user?
As you will understand from Allan Wittkopf's reply the feature is still under development and is so far undocumented.
So I don't know how it is or how it will become.

To make clear what I'm trying to say. Consider a usual ode:
ode:=diff(x(t),t,t)+t*x(t)=0;
sol:=dsolve({ode,x(0)=1,D(x)(0)=0},numeric);
plots:-odeplot(sol,[t,x(t)],0..15);
#Now use procedural input:
p:=proc(n,t,Y,YP)
  YP[1]:=Y[2];
  YP[2]:=-t*Y[1]
end proc;
res:=dsolve(numeric,number=2,procedure=p,start=0,initial=Array([1,0]),procvars=[x(t),diff(x(t),t)]);
plots:-odeplot(res,[t,x(t)],0..15);

So is there an analogue or will there be?
There is no point in me guessing.

@Allan Wittkopf Thanks for the info. Good to hear!

First 126 127 128 129 130 131 132 Last Page 128 of 231