You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
5.9 KiB
211 lines
5.9 KiB
%% Skript zum Plot mehrdimensionale Interpolation |
|
|
|
%Skript für Plotbasics |
|
basics_plot |
|
figure |
|
clf |
|
% hold on |
|
% box on |
|
% grid on |
|
|
|
|
|
P = [1 3 6 3 2;1 5 5 7 3;1 1 3 3 4]; |
|
|
|
mu = [0, 0.25, 0.5, 0.75, 1]; |
|
|
|
|
|
%% Polynomfit |
|
% |
|
ax = polyfit(mu,P(1,:),4); |
|
ay = polyfit(mu,P(2,:),4); |
|
az = polyfit(mu,P(3,:),4); |
|
|
|
x_poly = polyval(ax,[0:0.01:1]); |
|
y_poly = polyval(ay,[0:0.01:1]); |
|
z_poly = polyval(az,[0:0.01:1]); |
|
|
|
% plot([0:0.01:1],x_poly) |
|
|
|
plot3(x_poly,y_poly,z_poly,'Color',myLineTwo); |
|
|
|
hold on |
|
|
|
|
|
|
|
plot3(P(1,:),P(2,:),P(3,:),'LineStyle','none','Marker','o','Color',myLineTwo,'MarkerEdgeColor','black','MarkerFaceColor','black') |
|
|
|
|
|
text(P(1,1),P(2,1),P(3,1)-0.15,'$\mv{r}_0=\cp{0}$','Interpreter','none') |
|
text(P(1,2),P(2,2),P(3,2)+0.12,'$\mv{r}_1$','Interpreter','none') |
|
text(P(1,3)+0.08,P(2,3),P(3,3),'$\mv{r}_2$','Interpreter','none') |
|
text(P(1,4),P(2,4),P(3,4)+0.12,'$\mv{r}_3$','Interpreter','none') |
|
text(P(1,5),P(2,5),P(3,5)-0.20,'$\mv{r}_4=\cp{6}$','Interpreter','none') |
|
|
|
axis equal |
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
p = 3; % Man will für den Zwischenpunkt genau die Steigung noch angeben können. Evtl. muss man aber noch die zweite Ableitung mit angeben. |
|
%%%%%%%%%%%%%%%%%%%%%%%%%%% |
|
|
|
if mod(p,2) == 0 % Gerade |
|
subtr = 0; |
|
else |
|
subtr = 1; |
|
end |
|
|
|
|
|
%% B*P = R |
|
% Konstruktion des Vektors R in B*P = R |
|
%size(Bahn(teilstueckIterator).pj,2) > 2*(Gi+1) % Mehr als ein Punkt zu interpolieren |
|
R = [P(:,1)';zeros(1,3);P(:,2:end-1)';zeros(1,3);P(:,end)']; |
|
|
|
%% Berechnung der Basispolynomematrix B |
|
% Stetigkeit_Zwischenstueck = 1; |
|
distribution_type = 'equally_spaced'; |
|
% method = Gewünschte Methode zur Berechnung von u_par Es gibt 3 |
|
% Methoden: |
|
% 1. 'equally_spaced' |
|
% Gleiche Zeiteinheit je Verbindungsstrecke |
|
% 2. 'cord_length_distribution' |
|
% Zeiteinteilung entsprechend des direkten Abstands der Punkte |
|
% 3. 'centripetal_distribution' |
|
% Optimiert für scharfe Wendungen zwischen den Datenpunkten |
|
% Berechnung des Parametervektors |
|
u_par = berechne_u_par(P,distribution_type); % Sollte bei zwei zu interpolierenden Punkten immer 0 und 1 sein. |
|
% Berechnung des Knotenvektors |
|
u = berechne_u(u_par, p); |
|
Gi = 2; |
|
subtr = 1; |
|
grid on |
|
% |
|
% |
|
% |
|
% uidx = [min(u):0.01:max(u)]; |
|
% |
|
% Ni2 = zeros(numel(uidx),numel(u)-1-2); |
|
% Ni1 = zeros(numel(uidx),numel(u)-1-2); |
|
% Ni0 = zeros(numel(uidx),numel(u)-1-2); |
|
% |
|
% for i = 1:numel(uidx) |
|
% s = findspan(length(u)-p-2, p, uidx(i), u); |
|
% if s>4 |
|
% stop = 1; |
|
% end |
|
% ndu = Allbasisfun(s,uidx(i),p,u); |
|
% Ni2(i,s-(p+1)+1:s) = ndu(:,end)'; |
|
% % Ni1(i,s-(p+1)+1:s-1) = ndu(1:2,end-1)'; |
|
% % Ni0(i,s-(p+1)+1:s-2) = ndu(1,end-2)'; |
|
% end |
|
% |
|
% Ni2(Ni2==0)=nan; |
|
% % Ni1(Ni1==0)=nan; |
|
% % Ni0(Ni0==0)=nan; |
|
|
|
|
|
|
|
% |
|
% for i = 1:size(Ni2,2) |
|
% |
|
% switch i |
|
% case 1 |
|
% line=myLineOne; |
|
% |
|
% case 2 |
|
% line=myLineTwo; |
|
% |
|
% case 3 |
|
% line=myLineThree; |
|
% |
|
% case 4 |
|
% line=myLineFour; |
|
% |
|
% case 5 |
|
% line=myLineFive; |
|
% |
|
% case 6 |
|
% line=myLineSix; |
|
% |
|
% case 7 |
|
% line=myLineSeven; |
|
% |
|
% case 8 |
|
% line=myLineOne; |
|
% |
|
% end |
|
% |
|
% %Punkte generieren: |
|
% |
|
% plot(uidx,Ni2(:,i),'LineStyle','-','Color',line) |
|
% axeshandle = findall(f2, 'type', 'axes'); |
|
% set(axeshandle,'YLim',[0,1.1]); |
|
% |
|
% |
|
% end |
|
|
|
% legend('N_0','N_1','N_2','N_3','N_4','N_5','N_6','N_7') |
|
|
|
|
|
|
|
B = zeros(2*(2+1)+3,5+p-1); %Länge: 2*0-Gi-te Ableitung + alle zwischen Punkte (2- der Länge) x abhängig von gerades/ungerades p entweder n+1+p (p ger.) oder n+1+p-1 (p unger.) |
|
|
|
for parIter = 1:length(u_par) |
|
if parIter == 1 |
|
B((Gi+1)*(parIter-1)+1:(Gi+1)*parIter,parIter:parIter+p) = AllbasisfunDers(findspan(length(u)-p-2,p,u_par(parIter),u),u_par(parIter),p,u,2); |
|
elseif parIter == length(u_par) |
|
B(end:-1:end-Gi,parIter-1:parIter+p-1) = AllbasisfunDers(findspan(length(u)-p-2,p,u_par(parIter),u),u_par(parIter),p,u,2); |
|
else |
|
B((Gi+1)+(parIter-1):(0+1)+(parIter-1)+2,parIter:parIter+p) = AllbasisfunDers(findspan(length(u)-p-2,p,u_par(parIter),u),u_par(parIter),p,u,0); |
|
end |
|
|
|
end |
|
|
|
logvec = [true false true true true true true false true]; |
|
|
|
B = B(logvec,:); |
|
|
|
%% Berechnung des Vektors P |
|
|
|
P = B\R; |
|
|
|
Pw = [P';ones(1,size(P',2))]; |
|
|
|
BahnBuff(1).pj = Pw; |
|
BahnBuff(1).u = u; |
|
BahnBuff(1).p = p; |
|
% |
|
vek = bspeval(BahnBuff(1).p,BahnBuff(1).pj,BahnBuff(1).u,0:0.01:1); |
|
plot3(vek(1,:),vek(2,:),vek(3,:),'Color',myLineOne); |
|
hold on |
|
plot3(BahnBuff(1).pj(1,:)./BahnBuff(1).pj(end,:),BahnBuff(1).pj(2,:)./BahnBuff(1).pj(end,:),BahnBuff(1).pj(3,:)./BahnBuff(1).pj(end,:),'LineStyle','none','Marker','x','Color',myLineOne); |
|
axis equal |
|
|
|
plot3(BahnBuff.pj(1,:),BahnBuff.pj(2,:),BahnBuff.pj(3,:),'LineStyle','--','Color',myLineOne) |
|
|
|
% for i = 1:3 |
|
% vek = bspeval(BahnBuff(1).p,BahnBuff(1).pj,BahnBuff(1).u,0.25*i); |
|
% plot3(vek(1,:),vek(2,:),vek(3,:),'Color',myLineOne,'Marker','v','LineStyle','none'); |
|
% end |
|
|
|
for k = 2:numel(BahnBuff.pj(1,1:end))-1 |
|
text(BahnBuff.pj(1,k)./BahnBuff.pj(end,k)-0.05,BahnBuff.pj(2,k)./BahnBuff.pj(end,k)-0.05,BahnBuff.pj(3,k)./BahnBuff.pj(end,k)+0.08,['$\cp{' num2str(k-1) '}$'],'Interpreter','none') |
|
end |
|
|
|
set(gca,'XLim',[0,10]) |
|
set(gca,'YLim',[0,10]) |
|
|
|
xlabel('\figureXLabel') |
|
ylabel('\figureYLabel') |
|
zlabel('\figureZLabel') |
|
|
|
|
|
matlab2tikz('filename','plot_mehrdimensionale_Interpolation.tex',... |
|
'height', '\figureheight', 'width', '\figurewidth', 'encoding', 'UTF8', 'showInfo', false, 'checkForUpdates', false, ... |
|
'figurehandle',gcf,... |
|
'parseStrings', false, ... % switch off LaTeX parsing by matlab2tikz for titles, axes labels etc. ("greater flexibility", "use straight LaTeX for your labels") |
|
'floatFormat', '%.4g', ... % limit precision to get smaller .tikz files |
|
'noSize', false); |
|
|
|
|
|
|
|
|
|
|