vv

14077 Reputation

20 Badges

10 years, 70 days

MaplePrimes Activity


These are replies submitted by vv

@Rouben Rostamian  

Very nice, thank you.
So, it seems that pdsolve accepts discontinuous bc's but rejects discontinuous pdes, and converting the 2nd order PDE into a 1st order system does not always work.
The solution is to approximate the discontinuous pde or to implement a custom finite difference method, as you did.
[There should be some pdsolve options, but they seem to be hard to find].

The pde approximation method (also yours!) works well for your last example:

restart;
uexact := piecewise(x<0, erf(x/(2*sqrt(t))), 1/2*erf(x/(4*sqrt(t)))):
#K := x -> piecewise(x<=0, 1,4):
K := x -> 1+3*(1+erf(100*x))/2:
pde := { diff(u(x,t),t) =  diff(K(x)*diff(u(x,t),x), x)}:
bc:={ u(-1,t)=-erf(1/(2*sqrt(t))), u(1,t)=erf(1/(4*sqrt(t)))/2, u(x,0)=piecewise(x<0, -1, +1/2)}:
sol:=pdsolve(pde, bc, numeric, spacestep=1/200, timestep=0.0001):
p1:=sol:-animate(u, t=0..0.1, frames=25, color=red):
p2:=plots:-animate(plot,[uexact, x=-1..1, color=blue], t=0..0.1, frames=25):
plots:-display(p1,p2);

@Rouben Rostamian

It would be nice to know an exact solution for an example where c(x) (=K(x)) is also discontinuous.
It is in this case where I don't know theoretical results.

@Bart 

Yes, it seems that pdsolve rejects not only a discontinuous u(x,0) but also a continuous but non-smooth one.
Rouben's solution accepts any u(x,0) because it does not check it. It just solves the generated linear system.
I do not know what the theory says for such conditions and about the nature of the solution (when it exists).

(for Example 2)

restart;
K := x -> piecewise(x<0.5, 1, 10):
pde := {diff(u(x,t),t)=diff(v(x,t),x),
        v(x,t)=K(x)*diff(u(x,t),x)}: 
bc:={ u(0,t)=0, u(1,t)=1, u(x,0)=2 }:
sol:=pdsolve(pde, bc, numeric, spacestep=1/200):
sol:-animate(u, t=0..0.15);

@federicie

f:=proc(a,b,ev)
   local i; global A,B,F;
   if ev<>true then return 'last'(A,B)=F fi;
   A,B:=a,b;
   F:=add(evalf(sin(a+b+i)), i=1..10^5)
end:

 

@Carl Love 
In the 2019 help page:

This feature is currently not supported in 2-D math input

@Carl Love 

Maybe I am too conservative but I prefer the old style

ur:= proc(r) local i:=op(procname); A[i]*r + B[i]/r end;

 

@WebSuccess 

Unfortunately you have not checked your statement.

@byrktr 

Sorry, I don't know. But usually in such problems some heuristic is used.
BTW, I have corrected a typo in cond3.

Edit.
Here is an idea.
Solve the problem in real x[i,j,k],  in the interval 0..1. Maple can do it quickly.
One obtains an "approx" solution (with some conditions violated). Maybe you can start from here.

i1:=indets([cond1])<=~1:
i0:=indets([cond1])>=~0:
i01:=i0[],i1[]:

fracsol:=Optimization:-LPSolve( add(q[i],i=1..20), {seq(cond||i, i=1..6), i01} );
sol01_approx:=map(t -> (lhs(t)=round(rhs(t))), fracsol[2]);

@byrktr 

It is always a good idea to post the mathematical presentation of the problem. Then, an experienced user could come with a simpler/alternative solution.

@student_md 

Actually, it's the absolute error. For the relative error, use

numapprox:-infnorm((y-mExact)/mExact, 0..1);

 

@denbkh 

I can easily give recurrences with "complex" sums which cannot be solved.
If you have a specific one, why don't you post it?

You have just produced a duplicate. You already asked this in your previous question and have received a partial answer.
Why don't you wait, maybe someone will come with the rest.
Note that usually such duplicates are simply deleted!

@Chrono1 

For a polyhedron the same method can be used but the formulae for  anew,bnew in doit are more complicated.
Actually even for a non-regular tetrahedron these formulae are much more complicated.

 

@Carl Love 

And it's not so?

First 62 63 64 65 66 67 68 Last Page 64 of 177