pierwszy kod:
Kod: Zaznacz cały
function [u,x,y]=fdpoisson(pfunc,bfunc,a,b,n)
h=(b-a)/(n+1))% rozstaw siatki
[x,y]=meshgrin(a:h:b);
% liczenie u z warunkami brzegowymi
ub=zeros(n,n);
idx=2:n+1;
idy=2:n+1;
ub(:,1)=feval(bfunc,x(idx,1),y(idy,1));
ub(:,n)=feval(bfunc,x(idx,n+2),y(idy,n+2));
ub(:,1)= ub(1,1:n)+feval(bfunc,x(1,idx),y(1,idy));
ub(:,1)= ub(1,1:n)+feval(bfunc,x(n+2,idx),y(n+2,idy));
%zamiana ub na wektor
ub=(1/h^2)*reshape(u,b,n*n,1);
f=feval(pfunc,x(idx,idy),y(idx,idy));
f=reshape(f*n*n,1);
%macierz
z=[-2;1;zeros(n-2,1)];
D2x=1/h^2*kron(toeplitz(z,z),eye(n));
D2y=1/h^2*kron(toeplitz(n),eye(z,z));
%rozwiąznia układu
u=(D2x+D2y)\(f-ub);
% konwersja kolumny
u=reshape(u,n,n);
% dołączamy warunki brzegowe Dirichleta
u=[[feval(bfunc,x(1,1:n+2),y(1,1:n+2))];...
[[feval(bfunc,x(2:n+1,1),y(2:n+1,1))]u...
[feval(bfunc,x(2:n+1,n+2),y(2:n+1,n+2))]];...
[feval(bfunc,x(n+2,1:n+2),y(n+2,1:n+2))]];
Kod: Zaznacz cały
function testFdPoisson
f = inline('6*x.*y.*(1-y).-2*x^3');
g = inline('y.*(1-y).*x.^3');
[u,x,y]=fd2poisson(f,g,0,1,11);
h=x(1,2)-x(1,1);
%wykres
figure, set(gcf,'DefaultAxesFontSize',8,'PaperPoisition',[0 0 3.5 3.5]),
mesh(x,y,u), colormap([0 0 0]), xlabel('x'),ylabel('y'),zlabel('u(x,y)'),
title(strcat('Rozwiązanie numeryczne równania Poissona,h=',num2str(h)));
%plot error
figure, set(gcf,'Domyślny rozmiar czcionki osi',8,'PaperPosition',[0 0 1.5 1.5]),
mesh(x,y,u-g(x,y)), coloram([0 0 0 ], xlabel('x'),ylabel('y'),zlabel('error')),
title(stract('error, h=',num2str(h)));
Kod: Zaznacz cały
Undefined function or method 'fd2poisson' for input arguments of type 'inline'