Search code examples
equationequation-solvingmaple

Solving a system of equations in Maple


I have a system of n equations and n unknown variables under symbol sum. I want to create a loop to solve this system of equations when inputting n.

y := s -> 1/6cos(3s);

A := (k, s) -> piecewise(k <> 0, 1/2exp(ksI)/abs(k), k = 0, ln(2)exp(s0I) - sin(s));

s := (j, n) -> 2jPi/(2*n + 1);

n := 1; for j from -n to n do eqn[j] := sum((A(k, s(j, n))) . (a[k]), k = -n .. n) = y(s(j, n)); end do;

eqs := seq(eqn[i], i = -n .. n);

solve({eqs}, {a[i]});

enter image description here Please help me out!


Solution

  • I added some missing multiplication symbols to your plaintext code, to reproduce it.

    restart;
    y:=s->1/6*cos(3*s):
    A:=(k,s)->piecewise(k<>0,1/2*exp(k*s*I)/abs(k),
                        k=0,ln(2)*exp(s*I*0)-sin(s)):
    
    s:=(j,n)->2*j*Pi/(2*n+1):
    n:=1:
    
    for j from -n to n do
      eqn[j]:=add((A(k,s(j,n)))*a[k],k=-n..n)=y(s(j,n));
    end do:
    
    eqs:=seq(eqn[i],i=-n..n);
    
       (-1/4+1/4*I*3^(1/2))*a[-1]+(ln(2)+1/2*3^(1/2))*a[0]+(-1/4-1/4*I*3^(1/2))*a[1] = 1/6,
       1/2*a[-1]+ln(2)*a[0]+1/2*a[1] = 1/6,
       (-1/4-1/4*I*3^(1/2))*a[-1]+(ln(2)-1/2*3^(1/2))*a[0]+(-1/4+1/4*I*3^(1/2))*a[1] = 1/6
    

    You can pass the set of names (for which to solve) as an optional argument. But that has to contain the actual names, and not just the abstract placeholder a[i] as you tried it.

    solve({eqs},{seq(a[i],i=-n..n)});
    
         {a[-1] = 1/6*I/ln(2),
          a[0] = 1/6/ln(2),
          a[1] = -1/6*I/ln(2)}
    

    You could also omit the indeterminate names here, as optional argument to solve (since you wish to solve for all of them, and no other names are present).

    solve({eqs});
    
         {a[-1] = 1/6*I/ln(2),
          a[0] = 1/6/ln(2),
          a[1] = -1/6*I/ln(2)}
    

    For n:=3 and n:=4 it helps solve to get a result quicker here if exp calls are turned into trig calls. Ie,

    solve(evalc({eqs}),{seq(a[i],i=-n..n)});
    

    If n is higher than 4 you might have to wait long for an exact (symbolic) result. But even at n:=10 a floating-point result was fast for me. That is, calling fsolve instead of solve.

    fsolve({eqs},{seq(a[i],i=-n..n)});
    

    But even that might be unnecessary, as it seems that the following is a solution for n>=3. Here all the variables are set to zero, except a[-3] and a[3] which are both set to 1/2.

    cand:={seq(a[i]=0,i=-n..-4),seq(a[i]=0,i=-2..2),
           seq(a[i]=0,i=4..n),seq(a[i]=1/2,i=[-3,3])}:
    
    simplify(eval((rhs-lhs)~({eqs}),cand));
    
                  {0}