user672587
user672587

Reputation: 13

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!

Upvotes: 1

Views: 501

Answers (1)

acer
acer

Reputation: 7246

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}

Upvotes: 1

Related Questions