rozwiązanie rówania Poissona

0

Witam, mam dwa kody i uruchamiam drugi z nich, by obliczyć rozwiąznie równania Poissona i pojawia mi sie błąd, co mam nie tak?
pierwszy kod:

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))]];
      

i drugi

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)));
 

Po uruchomieniu programy pokazuje mi komunikat:
Undefined function or method 'fd2poisson' for input arguments of type 'inline'

jak to zmienić by działało??? Bo już skończyły mi się pomysły

1

No przecież jest napisane.

Nie analizowałem tego kodu, ale podana funkcja nazywa się fdpoisson a wywołujesz fd2poisson. (Można więc założyć, że bez zastanowienia używasz czyjegoś kodu)

0

Niestety to nie to...

0

Co to znaczy "to nie to". Tak to to, jeżeli zmienisz wywołanie na prawidłowe pojawi się inny błąd albo zadziała. Oczywiście o ile funkcja jest widoczna.

Odpaliłem sobie to w Octave:
h=(b-a)/(n+1))% rozstaw siatki
Tutaj nawiasy są źle.
[x,y]=meshgrin(a:h:b);
Tutaj ma być meshgrid.
ub=(1/h^2)*reshape(u,b,n*n,1);
Tutaj u jest niezdefiniowane, zapewne miało być ub bez przecinka.
f=reshape(f*n*n,1);
To jest bez sensu, coś jest źle. Być może miało być f, n*n.
u=(D2x+D2y)\(f-ub);
Niezależnie od tego co to jest f tutaj jest błąd przy dodawaniu. D2y jest pustą macierzą. Dalej nie mogłem sprawdzić.

0

mam teraz

 function [u,x,y]=FdPoisson(pfunc,bfunc,a,b,n)

h=(b-a)/(n+1))% rozstaw siatki

[x,y]=meshgrid(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))]];
     
     
     


i function testFdPocode> i ` function testFdPoisson

f = inline('6x.y.(1-y).-2x.^3');
g = inline('y.*(1-y).*x.^3');

[u,x,y]= FdPoisson(f,g,1,1,5000);
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'),ylael('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)));


i dalej to samo:(
0

A co ma się zmienić, skoro błędy nie są poprawione? Przecież Ty musisz zrozumieć co ten kod robi i poprawić/napisać go tak, żeby działał. To nie są błędy metody (tzn. nie wiem, może takie też są) tylko błędy składni albo ogólnej logiki! Wypisałem Ci wszystkie jakie znalazłem a poprawiony jest jeden - to oznacza, że pozostałe zostały.

Przestań programować metodą przez permutacje tylko się tego naucz albo zapłać komuś za gotowiec.

1 użytkowników online, w tym zalogowanych: 0, gości: 1