
Use("coeffguess");

Use("odesolver");

Single(i_IsInteger,n_IsInteger) <-- If(i = n,1,0);
DoSingle(i) := Single(globalDeg,i);


10 # CofFromDEaux(_x + _y) <-- CofFromDEaux(x) + CofFromDEaux(y);
10 # CofFromDEaux(_x - _y) <-- CofFromDEaux(x) - CofFromDEaux(y);
10 # CofFromDEaux(   - _y) <--              - CofFromDEaux(y);
10 # CofFromDEaux(_x * _y) <-- MakeCofM(CofFromDEaux(x), CofFromDEaux(y)); 
20 # CofFromDEaux(yyy(0)) <-- psi;
30 # CofFromDEaux(yyy(_n)) <-- DerivCofAllN(psi,n);

35 # CofFromDEaux(x) <--
[
  globalDeg := 1;
  MakeCof(Multiplex("DoSingle","+",0));
];

35 # CofFromDEaux(x^n_IsInteger) <--
[
  globalDeg := n;
  MakeCof(Multiplex("DoSingle","+",0));
];

36 # CofFromDEaux(constant_IsAtom) <--
[
  globalDeg := 0;
  
  CofMul(constant,MakeCof(Multiplex("DoSingle","*",1)));
];

CofFromDE(_f) <-- CofFromDEaux(OdeNormalForm(f));



10 # Alt(n_IsEven) <-- (-1)^(n/2);
20 # Alt(n_IsInteger) <-- 0;

/* Taylor for -Exp(-(x^2)) */
Effic(_n) <-- (Alt(n)/((n >> 1)!));


/*
 *  D(2,x)psi - Exp(-x^2)*psi = E * psi
 *
 * (experimental)
 */
CofDoEffic(_deg,_dim)<--
[
  CofDegree(deg);
  CofDim(dim);
  psi:=MakeCof();
  potential:= MakeCof(-1*Multiplex("Effic","*",1));
  CofEq(DerivCofAllN(psi,2) +MakeCofM(potential,psi) - CofMul(E,psi));
];


/*
 * The Yukawa potential (goes to electrostatic potential for a to infinity)
 *
 *  (Exp(-a*((x^2)^(1/2)))-1)/((x^2)^(1/2))
 * ((-1)^(n+1))*(a^(n+1))/(Sign(x)^n*((n+1)!))
*/
Yukawa(_n) <-- ((-1)^(n+1))*(alpha^(n+1))/(Sign(x)^n*((n+1)!));
CofDoYukawa(_deg,_dim)<--
[
  CofDegree(deg);
  CofDim(dim);
  psi:=MakeCof();
  potential:= MakeCof(-1*Multiplex("Yukawa","*",1));
  CofEq(DerivCofAllN(psi,2) +MakeCofM(potential,psi) - CofMul(E,psi));
];


/*
 *  D(2,x)psi + E * psi = 0
 *
 * (solutions are sin,cos)
 */
CofDoHarmonic(_deg,_dim)<--
[
  CofDegree(deg);
  CofDim(dim);
  psi:=MakeCof();
  CofEq(DerivCofAllN(psi,2) - CofMul(E,psi));
];

/*
 *  D(1,x)psi = E * psi
 *
 * (solution is Exp(x)-like)
 * y' == E*y
 */
CofDoDiffuse(_deg,_dim)<--
[
  CofDegree(deg);
  CofDim(dim);
  psi:=MakeCof();
  CofEq(CofFromDE(y' == E*y)); 
/*  CofEq(DerivCofAllN(psi,1) - CofMul(E,psi)); */
];


Single1(_n) <-- Single(1,n);
Single2(_n) <-- Single(2,n);
/*
 *  D(2,x)psi + x^2 * psi  = E * psi 
 */
CofDoXsqr(_deg,_dim)<--
[
  CofDegree(deg);
  CofDim(dim);
  psi:=MakeCof();
  potential:= MakeCof(Multiplex("Single2","+",0));
  CofEq(DerivCofAllN(psi,2) +MakeCofM(potential,psi) - CofMul(E,psi));
];

/*
 *  D(1,x)psi + x * psi  = E * psi
 *
 * (for E=0 the solution is Exp(-x^2/2)
 */
CofDoNormal(_deg,_dim)<--
[
  CofDegree(deg);
  CofDim(dim);
  psi:=MakeCof();
  potential:= MakeCof(Multiplex("Single1","+",0));
  CofEq(DerivCofAllN(psi,1) +MakeCofM(potential,psi) - CofMul(E,psi));
];


CofPlot(_from,_to,_steps)<--
[
  Local(applied,E,f);
  Apply("GnuPlot",{from,to,steps,{CofT()}});
  Echo({"solution is ",CofT()});
  E:=CofFindE();
  f:=E*CofT();
  applied:=CofT(CofMap(CofTaylor(cofeq + CofMul(E,psi),cofdegree)));
  applied:=BigOh(applied,x,cofdegree);
  Apply("GnuPlot",{from,to,steps,{f,applied}});
];
CofPlot()<--
[
  CofPlot(-3,3,20);
];

CofTry(_deg,_dim,_eq,_extra) <--
[
  CofDegree(deg);
  CofDim(dim);
  psi:=MakeCof();
  CofEq(CofFromDE(eq)); 
  CofSetUp(extra);
];



/* diffuse */
/*
CofTry(10,1,y' == E*y,{aS0==1,aS1==1,E==1});
*/


/* harmonic (solutions are sin,cos) */
/*
CofTry(10,1,y'' + E*y == 0,{aS0==0,aS1==1,aS3== -1/6});
*/

/*
CofTry(8,1,y'' + x^2 * y == E*y,{aS0==1,aS1==2,aS5==1});
*/




/*
CofDoNormal(10,1);
CofSetUp({aS0==1,aS1==0,E == 0});
*/



CofTry(10,1,y' + x * y == 0,{aS0==1,aS1==0});


/*
CofDoNormal(3,2);
CofSetUp({});
*/

/*
CofDoYukawa(5,1);
CofSetUp({alpha==1,E==0,aS1==1,aS3==1});
*/


CofSolve();
CofPlot();
/*
*/


/*
CofDegree(5);
CofDim(1);
psi:=MakeCof();
*/

