function Z=Mlamposin(x,t,c,LtaiFile,b)
% HA 11.3.05
% Lasketaan lämpöyhtälön u_t = c^2 u_xx sinisarjaratkaisu korkeusmatriisina
%
% Kutsut:
%  1) U = Mlamposin(x,t,c,tiedosto);
%    Tiedostosta luetaan L ja b
%  2) U = Mlamposin(x,t,c,L,b);
%    Sauvan pituus L ja kerroinvektori b annetaan Matlabissa.
% Input:    
%        x:   x-pisteet
%        t:   aikapisteet
%        c:   c (Lämpöyhtälön c)  (Muista c^2 itse yhtälössä.)
%        LtaiFile: Jos ei lueta, annetaan sauavn pituus L
%                  Jos luetaan, annetaan tiedoston nimi.
%        b:   Kerroinvektori, jos ei anneta, luetaan tiedostosta.
% Output: Z -  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 'sinkert' kirjoitettiin.
% Esim:
% clear; close all
% 
% t=linspace(0,0.5,20); x=linspace(0,pi,50);
% U=Mlamposin(x,t,1,'btied'); % b-kertoimet luetaan tiedostosta.
% surfc(x,t,U); colorbar % Pintapiirros
% figure
% plot(x,U)      % Lämpötilaprofiilit t-vektorin 
%                % ilmaisemilla ajanhetkillä.
%
 polku='/tmp/';        % UNIX  % Muuta tarpeen mukaan.
%polku='C:\MATLAB6p1\work\';  % WIN  % Muuta tarpeen mukaan.
if nargin==4
    tiedosto=[polku LtaiFile];
    Lb=load(tiedosto);    
    L=Lb(1);
    b=Lb(2:end);
else
    L=LtaiFile;
end;

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,
                            % ...
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';