function Z=lamposin(c,x,t,Lb)
% HA 18.3.05
%
% Lasketaan lämpöyhtälön u_t = c^2 u_xx sinisarjaratkaisu korkeusmatriisina
% Kutsu: U=lamposin(c,x,t,Lb)
% Input: 
%        c:   c (Lämpöyhtälön c)  (vakio = c^2)
%        x:   x-pisteet
%        t:   aikapisteet
%        Lb:   Joko tiedoston nimi tai muuttuja Lb, jossa sauvan pituus ja 
%              kertoimet muodossa [L,b1,b2,...]
%             ( Tyypillinen muoto 'Lb' tai Lb)
% Output: U -  lämpötilamatriisi, rivit ovat x:n, sarakkeet t:n pituisia.
% Huom! Jos kertoimet luetaan tiedostosta, on tarkistettava ja tarpeen
%       mukaan muutettava tiedostopolku ja nimi yhteensopivaksi sen kanssa,
%       jonne Maple-funktiolla 'siniSkertoimet' kirjoitettiin.
% Esim:
% clear; close all
% 
% t=linspace(0,0.5,20); x=linspace(0,pi,50);
% U=lamposin(1,x,t,'HALb'); % b-kertoimet luetaan tiedostosta 'HALb'.
% surfc(x,t,U); colorbar % Pintapiirros
% figure
% plot(x,U)      % Lämpötilaprofiilit t-vektorin 
%                % ilmaisemilla ajanhetkillä.
%
if ischar(Lb) 
     polku='/tmp/';        % UNIX  % Muuta tarpeen mukaan.
%    polku='C:\MATLAB6p1\work\';  % WIN  % Muuta tarpeen mukaan.
    tiedosto=[polku Lb];
    Lb=load(tiedosto);
end;
    L=Lb(1); b=Lb(2:end);   % Tarkista, että Maple-funktio kirjoittaa
                            % tyyliin: [L,b1,b2,...]

b=b(:);   % Varmistus pystyvektoriksi

kertoimet=b*ones(size(x)); % Eräs monista tavoista tehdä matriisi, jonka
                            % 1. rivi on vakio a0
                            % 2. rivi on vakio a1,
                            % ...
                             % (repmat ehkä tehokkaampi)
M=length(x);
N=length(t);
nb=length(b);                            
termit=kertoimet.*sin(pi/L*(1:nb)'*x);          
summa=sum(termit);
Z=zeros(M,N);
for n=1:nb;
   Z=Z+(b(n)*sin(n*pi*x./L))'*exp(-((n*pi*c/L)^2)*t);
end;
Z=Z';
