Energy method with Hermite cubic function (2 essential condition)
Show older comments
The different proble is:
-(x^2 y')'+20y=7*x^2 -5
y(-1)=0
y(1)=0
sol: y=(x^2)/2-(x^4)/4-1/4
The next code has the following problem:
Unrecognized function or variable 'm'.
Error in ex_enerHermite>support (line 170)
if l>=2*m
Error in ex_enerHermite (line 10)
[lbl,rbl]=support(l,m);
how can I solve it? Where is the errore?
function [x,u]=ex_enerHermite(m,nv)
%problema con due condizioni essenziali
h=2/m;
xc=-1:h:1;
A=zeros(2*m);%se non ho condizioni essenziali diventa 2*m+2
b=zeros(2*m,1);%se non ho condizioni essenziali diventa 2*m+2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Caso condizione essenziale in a
for l=1:2*m %se non ho condizioni essenziali diventa 2*m+2
[lbl,rbl]=support(l,m);
for j=1:2*m %se non ho condizioni essenziali diventa 2*m+2
if abs(l-j)<4 %altrimenti l'integrale fa zero causa supporto base
[lbj,rbj]=support(j,xc);
lb=max(lbl,lbj);
rb=min(rbl,rbj);
tol=10^-8;
if abs(lb-rb)>=tol
% termine di bordo già inserito alla linea 26
A(l,j)=integral(@(x)fA(x,l,j,xc),lb,rb);
end
end
end
b(l)=integral(@(x)fb(x,l,xc),lbl,rbl);
end
delta=A\b;
h=2/nv;
x=-1:h:1;
u=zeros(1,size(x));
for l=1:2*m %da cambiare in base a dove fai la sommatoria della soluzione u
u=u+delta(l)*fu(x,l,xc);
%se cond. ess. in a allora l=1:2*m+1 e
%u=u+delta(l)*fu(x,l,xc)
%se non ho cond. ess. allora l=0:2*m+1 e
%u=u+delta(l+1)*fu(x,l,xc)
end
%u è la soluzione del problema traslato quindi se necessario aggiungo l(x)
end
function y=fH(x,l,xc) %non toccare
m=length(xc)-1;
y=zeros(size(x));
for j=1:length(x)
if l==0
if xc(1)<=x(j) && x(j)<xc(2)
y(j)=3*(((xc(2)-x(j))/(xc(2)-xc(1)))^2)-...
2*(((xc(2)-x(j))/(xc(2)-xc(1)))^3);
end
elseif l==m
if xc(m)<x(j) && x(j)<=xc(m+1)
y(j)=3*(((x(j)-xc(m))/(xc(m+1)-xc(m)))^2)-...
2*(((x(j)-xc(m))/(xc(m+1)-xc(m)))^3);
end
else
if xc(l)<x(j) && x(j)<=xc(l+1)
y(j)=3*(((x(j)-xc(l))/(xc(l+1)-xc(l)))^2)-...
2*(((x(j)-xc(l))/(xc(l+1)-xc(l)))^3);
elseif xc(l+1)<=x(j) && x(j)<xc(l+2)
y(j)=3*(((xc(l+2)-x(j))/(xc(l+2)-xc(l+1)))^2)-...
2*(((xc(l+2)-x(j))/(xc(l+2)-xc(l+1)))^3);
end
end
end
end
function y=fS(x,l,xc) %non toccare
m=length(xc)-1;
y=zeros(size(x));
for j=1:length(x)
if l==0
if xc(1)<=x(j) && x(j)<xc(2)
y(j)=((xc(2)-x(j))^2/(xc(2)-xc(1)))-...
((xc(2)-x(j))^3/(xc(2)-xc(1))^2);
end
elseif l==m
if xc(m)<x(j) && x(j)<=xc(m+1)
y(j)=-((x(j)-xc(m))^2/(xc(m+1)-xc(m)))+...
((x(j)-xc(m))^3/(xc(m+1)-xc(m))^2);
end
else
if xc(l)<x(j) && x(j)<=xc(l+1)
y(j)=-((x(j)-xc(l))^2/(xc(l+1)-xc(l)))+...
((x(j)-xc(l))^3/(xc(l+1)-xc(l))^2);
elseif xc(l+1)<=x(j) && x(j)<xc(l+2)
y(j)=((xc(l+2)-x(j))^2/(xc(l+2)-xc(l+1)))-...
((xc(l+2)-x(j))^3/(xc(l+2)-xc(l+1))^2);
end
end
end
end
function y=dH(x,l,xc) %non toccare
m=length(xc)-1;
y=zeros(size(x));
for j=1:length(x)
if l==0
if xc(1)<=x(j) && x(j)<xc(2)
y(j)=(6/(xc(2)-xc(1)))*((xc(2)-x(j))/(xc(2)-xc(1)))*...
((xc(2)-x(j))/(xc(2)-xc(1))-1);
end
elseif l==m
if xc(m)<x(j) && x(j)<=xc(m+1)
y(j)=(6/(xc(m+1)-xc(m)))*((x(j)-xc(m))/(xc(m+1)-xc(m)))*...
(1-((x(j)-xc(m))/(xc(m+1)-xc(m))));
end
else
if xc(l)<x(j) && x(j)<=xc(l+1)
y(j)=(6/(xc(l+1)-xc(l)))*((x(j)-xc(l))/(xc(l+1)-xc(l)))*...
(1-((x(j)-xc(l))/(xc(l+1)-xc(l))));
elseif xc(l+1)<=x(j) && x(j)<xc(l+2)
y(j)=(6/(xc(l+2)-xc(l+1)))*((xc(l+2)-x(j))/(xc(l+2)-xc(l+1)))*...
((xc(l+2)-x(j))/(xc(l+2)-xc(l+1))-1);
end
end
end
end
function y=dS(x,l,xc) %non toccare
m=length(xc)-1;
y=zeros(size(x));
for j=1:length(x)
if l==0
if xc(1)<=x(j) && x(j)<xc(2)
y(j)=3*(((xc(2)-x(j))/(xc(2)-xc(1)))^2)-...
2*((xc(2)-x(j))/(xc(2)-xc(1)));
end
elseif l==m
if xc(m)<x(j) && x(j)<=xc(m+1)
y(j)=3*(((x(j)-xc(m))/(xc(m+1)-xc(m)))^2)-...
2*((x(j)-xc(m))/(xc(m+1)-xc(m)));
end
else
if xc(l)<x(j) && x(j)<=xc(l+1)
y(j)=3*(((x(j)-xc(l))/(xc(l+1)-xc(l)))^2)-...
2*((x(j)-xc(l))/(xc(l+1)-xc(l)));
elseif xc(l+1)<=x(j) && x(j)<xc(l+2)
y(j)=3*(((xc(l+2)-x(j))/(xc(l+2)-xc(l+1)))^2)-...
2*((xc(l+2)-x(j))/(xc(l+2)-xc(l+1)));
end
end
end
end
function y=fu(x,l,xc) %scrivi quello che hai trovato nei calcoli della base u_l, attento all'indice l
if l==2*m
y=fS(x,m,xc);
elseif mod(l,2)==1
y=fS(x,(l-1)/2,xc);
else
y=fH(x,l/2,xc);
end
end
function y=du(x,l,xc) %derivata di u_l
if l==2*m
y=dS(x,m,xc);
elseif mod(l,2)==1
y=dS(x,(l-1)/2,xc);
else
y=dH(x,l/2,xc);
end
end
function [lb,rb]=support(l,xc)
%se abbiamo u_0 aggiungo if l==0 lb=xc(1); rb=xc(2);
if l>=2*m
lb=xc(m);
rb=xc(m+1);
elseif mod(l,2)==1 %sono le funzioni S
%In generale alcuni supporti sono più piccoli ma questo va bene per
%tutti, idem nelle funzioni H
lb=xc((l-1)/2);
rb=xc(2+(l-1)/2);
else %sono le funzioni H
lb=xc(l/2);
rb=xc(2+l/2);
end
end
function y=fA(x,l,j,xc)
%Inserisci la funzione integranda per la matrice A
y=(x.^2).*du(x,l,xc).*du(x,j,xc)+20.*fu(x,l,xc).*fu(x,j,xc);
end
function y=fb(x,l,xc)
%Inserisci la funzione integranda per il vettore b
y=(7.*(x.^2)-5).*fu(x,l,xc);
end
Accepted Answer
More Answers (0)
Categories
Find more on Programming in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!