function PPmod(action) %global line_handles global select_point switch action case 'create' delete(findobj(gcbf,'Tag','P')) set(findobj(gcbf,'Tag','Pushbutton4'),'TooltipString','Uniform mesh') set(findobj(gcbf,'Tag','Pushbutton5'),'TooltipString','Refine mesh') set(findobj(gcbf,'Tag','mod_type'),'TooltipString','Redefine mesh') c=get(findobj(gcbf,'Tag','continuity'),'Value'); d=get(findobj(gcbf,'Tag','degree'),'Value'); ni=ceil(20*get(findobj(gcbf,'Tag','ni'),'Value')); set(findobj(gcbf,'Tag','ni'),'Userdata',ni) h=1/ni; if isempty(get(findobj(gcbf,'Tag','my_fcn'),'String')) set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Define a function first') disp('Define a function now') else set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Interpolate') disp('Interpolate') end for i=1:ni if d==1 % p.w. constant XData=[(i-1)*h i*h]; Y1=rand(1); if c==2&i>1 % continuous Y1=YData(length(YData)); end YData=[Y1 Y1]; end if d==2 % p.w. linear XData=[(i-1)*h i*h]; Y1=rand(1); Y2=rand(1); if c==2&i>1 % continuous Y1=YData(length(YData)); end YData=[Y1 Y2]; end if d==3 % p.w. quadratic XData=(i-1)*h:h/10:i*h; Y1=rand(1); Y2=rand(1); Y3=rand(1); if c==2&i>1 % continuous Y1=YData(length(YData)); end x=0:.1:1; YData=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1); end line_handles(2*i)=line(XData,YData,'Tag','P'); line_handles(2*i-1)=line(XData,0*YData,'Color','g','Tag','P'); end line_handles(2*ni+1)=line([0 0],[0 0],'Color','w'); line_handles(2*ni+2)=line([0 0],[0 0],'Color','w'); set(findobj(gcbf,'Tag','create'),'Userdata',line_handles) % xlabel('x') case 'start' xmax=get(gca,'Xlim'); select_point = get(gca, 'CurrentPoint'); if select_point(1)xmax(2) break end mod_type=get(findobj(gcbf,'Tag','mod_type'),'Value'); if isempty(findobj(gcbf,'Tag','P')) disp('Create a mesh first') break end if mod_type==1 set(gcbf, 'WindowButtonMotionFcn',... 'PPmod(''change_PP_values'')'); elseif mod_type==2 set(gcbf, 'WindowButtonMotionFcn',... 'PPmod(''move_nodes'')'); elseif mod_type==3 set(gcbf, 'WindowButtonMotionFcn',... 'PPmod(''add_nodes'')'); end set(gcbf, 'WindowButtonUpFcn', 'PPmod(''stop'')'); case 'change_PP_values' line_handles=get(findobj(gcbf,'Tag','create'),'Userdata'); ni=get(findobj(gcbf,'Tag','ni'),'Userdata'); c=get(findobj(gcbf,'Tag','continuity'),'Value'); d=get(findobj(gcbf,'Tag','degree'),'Value'); cp = get(gca, 'CurrentPoint'); %if cp(1)<0 % break %end [interval, node]=find_node(select_point); y1=cp(1,2); if (c==1&d==1)|(c==2&d==2) for j=1:ni YData=get(line_handles(2*j),'YData'); Y(j)=YData(1); if j==ni Y(j+1)=YData(2); end if interval==j&node==1 int=interval+1; end if interval==j&node==-1 Y(j)=y1; int=interval; end end if node==0&d==2 return elseif node==0&d==1 int=interval; end if int<=4 text=['v(x) = '... num2str(Y(1),'%1.2f') ' \phi_1(x) + '... num2str(Y(2),'%1.2f') ' \phi_2(x) + '... num2str(Y(3),'%1.2f') ' \phi_3(x) + '... num2str(Y(4),'%1.2f') ' \phi_4(x) + ...']; title(text,'FontSize',11) elseif int>4 text=['v(x) = '... ' ... + '... num2str(Y(int-3),'%1.2f') ' \phi_{',num2str(int-3),'}(x) + '... num2str(Y(int-2),'%1.2f') ' \phi_{',num2str(int-2),'}(x) + '... num2str(Y(int-1),'%1.2f') ' \phi_{',num2str(int-1),'}(x) + '... num2str(Y(int),'%1.2f') ' \phi_{',num2str(int),'}(x) + ...']; title(text,'FontSize',11) end elseif c==2&d==3 counter=1; for i=1:ni if interval==i&node==-1 int=i*2-1; elseif interval==i&node==0 int=i*2; elseif interval==i&node==1 int=i*2+1; end YData=get(line_handles(2*i),'YData'); Y(counter)=YData(1); Y(counter+1)=YData(6); counter=counter+2; end Y(counter)=YData(11); if int<=4 text=['v(x) = '... num2str(Y(1),'%1.2f') ' \phi_1(x) + '... num2str(Y(2),'%1.2f') ' \phi_2(x) + '... num2str(Y(3),'%1.2f') ' \phi_3(x) + '... num2str(Y(4),'%1.2f') ' \phi_4(x) + ...']; title(text,'FontSize',11) elseif int>4 text=['v(x) = '... ' ... + '... num2str(Y(int-3),'%1.2f') ' \phi_{',num2str(int-3),'}(x) + '... num2str(Y(int-2),'%1.2f') ' \phi_{',num2str(int-2),'}(x) + '... num2str(Y(int-1),'%1.2f') ' \phi_{',num2str(int-1),'}(x) + '... num2str(Y(int),'%1.2f') ' \phi_{',num2str(int),'}(x) + ...']; title(text,'FontSize',11) end elseif c==1&d==2 counter=1; for j=1:ni YData=get(line_handles(2*j),'YData'); if interval==j&node==1 int=interval*2; end if interval==j&node==-1 int=interval*2-1; end Y(counter)=YData(1); Y(counter+1)=YData(2); counter=counter+2; end if node==0 return end if int<=4 text=['v(x) = '... num2str(Y(1),'%1.2f') ' \phi_1(x) + '... num2str(Y(2),'%1.2f') ' \phi_2(x) + '... num2str(Y(3),'%1.2f') ' \phi_3(x) + '... num2str(Y(4),'%1.2f') ' \phi_4(x) + ...']; title(text,'FontSize',11) elseif int>4 text=['v(x) = '... ' ... + '... num2str(Y(int-3),'%1.2f') ' \phi_{',num2str(int-3),'}(x) + '... num2str(Y(int-2),'%1.2f') ' \phi_{',num2str(int-2),'}(x) + '... num2str(Y(int-1),'%1.2f') ' \phi_{',num2str(int-1),'}(x) + '... num2str(Y(int),'%1.2f') ' \phi_{',num2str(int),'}(x) + ...']; title(text,'FontSize',11) end elseif c==1&d==3 counter=1; for i=1:ni if interval==i&node==-1 int=i*3-2; elseif interval==i&node==0 int=i*3-1; elseif interval==i&node==1 int=i*3; end YData=get(line_handles(2*i),'YData'); Y(counter)=YData(1); Y(counter+1)=YData(6); Y(counter+2)=YData(11); counter=counter+3; end if int<=4 text=['v(x) = '... num2str(Y(1),'%1.2f') ' \phi_1(x) + '... num2str(Y(2),'%1.2f') ' \phi_2(x) + '... num2str(Y(3),'%1.2f') ' \phi_3(x) + '... num2str(Y(4),'%1.2f') ' \phi_4(x) + ...']; title(text,'FontSize',11) elseif int>4 text=['v(x) = '... ' ... + '... num2str(Y(int-3),'%1.2f') ' \phi_{',num2str(int-3),'}(x) + '... num2str(Y(int-2),'%1.2f') ' \phi_{',num2str(int-2),'}(x) + '... num2str(Y(int-1),'%1.2f') ' \phi_{',num2str(int-1),'}(x) + '... num2str(Y(int),'%1.2f') ' \phi_{',num2str(int),'}(x) + ...']; title(text,'FontSize',11) end end if d==1&node==0 YData=[y1 y1]; set(line_handles(2*interval),'YData',YData) if c==1 XData=get(line_handles(2*interval),'XData'); set(line_handles(2*interval-1),'YData',[y1 y1]) set(line_handles(2*ni+1),... 'XData',[XData(1) XData(1)],... 'YData',[0 y1],'LineStyle',':',... 'Color','g','Tag','P'); set(line_handles(2*ni+2),... 'XData',[XData(2) XData(2)],... 'YData',[0 y1],'LineStyle',':',... 'Color','g','Tag','P'); end end if d==2 YData=get(line_handles(2*interval),'YData'); if node==-1 YData(1)=y1; Y2Data=[y1 0]; set(line_handles(2*interval),'YData',YData) set(line_handles(2*interval-1),'YData',Y2Data) elseif node==1 YData(2)=y1; Y2Data=[0 y1]; set(line_handles(2*interval),'YData',YData) set(line_handles(2*interval-1),'YData',Y2Data) end end if d==3 YData=get(line_handles(2*interval),'YData'); Y1=YData(1); Y2=YData(6); Y3=YData(11); Y21=0; Y22=0; Y23=0; if node==-1 Y1=y1; Y21=y1; elseif node==1 Y3=y1; Y23=y1; else Y2=y1; Y22=y1; end x=0:.1:1; YData=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1); set(line_handles(2*interval),'YData',YData) Y2Data=Y21*(1-x).*(1-2*x)+Y22*4*x.*(1-x)+Y23*x.*(2*x-1); set(line_handles(2*interval-1),'YData',Y2Data) end if c==2 i=interval; if d==1 for j=1:ni set(line_handles(2*j),'YData',[y1 y1]) end end if d==2 if interval>1&node==-1 YData=get(line_handles(2*i-2),'YData'); YData(2)=y1; Y2Data=[0 y1]; set(line_handles(2*i-2),'YData',YData) set(line_handles(2*i-3),'YData',Y2Data) end if interval1&node==-1 YData=get(line_handles(2*i-2),'YData'); Y1=YData(1); Y21=0; Y2=YData(6); Y22=0; Y3=y1; Y23=y1; x=0:.1:1; YData=Y1*(1-x).*(1-2*x)+Y2*4*x.*(1-x)+Y3*x.*(2*x-1); set(line_handles(2*i-2),'YData',YData) Y2Data=Y21*(1-x).*(1-2*x)+Y22*4*x.*(1-x)+Y23*x.*(2*x-1); set(line_handles(2*i-2-1),'YData',Y2Data) end if interval1 XData=get(line_handles(2*interval),'XData'); x2=XData(length(XData)); x1=min(x1,x2); h=x2-x1; XData=[x1 x2]; if d==3 XData=x1:h/10:x2; end set(line_handles(2*interval),'XData',XData) set(line_handles(2*interval-1),'XData',XData) YDataR=get(line_handles(2*interval),'YData'); mi=min(0,YDataR(1)); ma=max(0,YDataR(1)); % Y2Data=0*YData; % Y2Data(1)=YData(1); % set(line_handles(2*interval-1),'YData',Y2Data) XData=get(line_handles(2*interval-2),'XData'); x0=XData(1); x1=max(x1,x0); h=x1-x0; XData=[x0 x1]; if d==3 XData=x0:h/10:x1; end set(line_handles(2*interval-2),'XData',XData) set(line_handles(2*interval-2-1),'XData',XData) YDataL=get(line_handles(2*interval-2),'YData'); mi=min(mi,YDataL(length(YDataL))); ma=max(ma,YDataL(length(YDataL))); % Y2Data=0*YData; % Y2Data(length(Y2Data))=YData(length(YData)); % set(line_handles(2*interval-2-1),'YData',Y2Data) set(line_handles(2*ni+1),'XData',[x1 x1],... 'YData',[mi ma],... 'LineStyle',':','Color','b') end if node==1&interval=1 e=0; dy_norm=0; d2y_norm=0; for i=1:ni XData=get(line_handles(2*i),'XData'); h=XData(length(XData))-XData(1); YData=get(line_handles(2*i),'YData'); for j=1:10 if d==3 x=(XData(j)+XData(j+1))/2; y=eval(f); x=XData(j); dy=eval(f); x=XData(j+1); dy=(eval(f)-dy)/h/10; Y=(YData(j)+YData(j+1))/2; else x=XData(1)+(j-0.5)*h/10; y=eval(f); dY=YData(length(YData))-YData(1); Y=YData(1)+(j-0.5)*dY/10; end x=XData(1)+(j-1)*h/10; y0=eval(f); x=XData(1)+(j-0.5)*h/10; y1=eval(f); x=XData(1)+j*h/10; y2=eval(f); dy=(y2-y0)/(h/10); d2y=((y2-y1)-(y1-y0))/(h/20)^2; if n==2 e=max(e,abs(y-Y)); dy_norm=max(dy_norm,abs(h*dy)); d2y_norm=max(d2y_norm,abs(h^2*d2y)); elseif n==3 e=e+(y-Y)^2*h/10; dy_norm=dy_norm+(h*dy)^2*h/10; d2y_norm=d2y_norm+(h^2*d2y)^2*h/10; end end end if n==3 e=sqrt(e); dy_norm=sqrt(dy_norm); d2y_norm=sqrt(d2y_norm); end if e==0 & dy_norm==0 & d2y_norm==0 set(findobj(gcbf,'Tag','error'),'String','||u-v||') set(findobj(gcbf,'Tag','dy'),'String','||hDu||') set(findobj(gcbf,'Tag','d2y'),'String','||h^2D^2u||') else set(findobj(gcbf,'Tag','error'),... 'String',['||u-v||=' num2str(e)]) set(findobj(gcbf,'Tag','dy'),... 'String',['||hDu||=' num2str(dy_norm)]) set(findobj(gcbf,'Tag','d2y'),... 'String',['||h^2D^2u||=' num2str(d2y_norm)]) end % c_i1=e/dy_norm % c_i2=e/d2y_norm % end case 'reset' set(findobj(gcbf,'Tag','function'),'Value',1) set(findobj(gcbf,'Tag','norm'),'Value',1) set(findobj(gcbf,'Tag','continuity'),'Value',2) set(findobj(gcbf,'Tag','degree'),'Value',2) set(findobj(gcbf,'Tag','ni'),'Value',0.3,'Userdata',[]) set(findobj(gcbf,'Tag','mod_type'),'Value',1) title('') set(findobj(gcbf,'Tag','error'),'String','') set(findobj(gcbf,'Tag','dy'),'String','') set(findobj(gcbf,'Tag','d2y'),'String','') set(findobj(gcbf,'Tag','my_fcn'),'String','') set(findobj(gcbf,'Tag','Pushbutton3'),'TooltipString','Define a function or a mesh first') set(findobj(gcbf,'Tag','Pushbutton4'),'TooltipString','Create a mesh first') set(findobj(gcbf,'Tag','Pushbutton5'),'TooltipString','Create a mesh first') set(findobj(gcbf,'Tag','mod_type'),'TooltipString','Create a mesh first') end function [interval, node]=find_node(select_point) %global line_handles line_handles=get(findobj(gcbf,'Tag','create'),'Userdata'); ni=get(findobj(gcbf,'Tag','ni'),'Userdata'); for i=1:ni XData=get(line_handles(2*i),'XData'); x1=XData(1); x2=XData(length(XData)); x=select_point(1,1); if x1<=x&x<=x2 interval=i; if x-x1<0.2*(x2-x1) node=-1; elseif x2-x<0.2*(x2-x1) node=1; else node=0; end end end