WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Mit "Function" top, ohne - error Flop!?

 

Gelo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2011, 14:26     Titel: Mit "Function" top, ohne - error Flop!?
  Antworten mit Zitat      
hi!
Ich werke da an einem File und verstehe nicht, warum die function-Umgebung so einen unterschied macht.

Mit function sieht der Code so aus:

Code:

function par_kin
%
% MATLAB function from:
% "Elements of Modern X-ray Physics" by Jens Als-Nielsen and Des McMorrow
%
% Calculates: Parratt and kinematical reflectivities from a multilayer
%             Specific case of W/Si, 10 bilayers of [10 Angs W, 40 Angs Si]

r0=2.82e-5;                             % Thompson scattering length in Angs
Q=0.01:0.001:0.3;                       % Wavevector transfer in 1/Angs
lambda=1.54;                            % wavelength in Angs
rhoA=4.678; muA=33.235e-6;              % density and absorption coefficient of W
rhoB=0.699; muB=1.399e-6;               % density and absorption coefficient of Si

bl=[rhoA*r0+i*muA rhoB*r0+i*muB];                 % bilayer scattering factor  
dbl=[10 40];                                      % bilayer d-spacings
ml=[bl bl bl bl bl bl bl bl bl bl 0.1e-20];       % multilayer scattering factor
dml=[dbl dbl dbl dbl dbl dbl dbl dbl dbl dbl];    % multilayer d-spacings
sml=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];  % roughness at each interface

%------ Parratt reflectivity

R=parratt(Q,lambda,ml,dml,sml);

axes('position',[0.2 0.15 0.7 0.4]); line(Q,R)
axis([0 0.3 8e-6 2]);
set(gca,'FontName','Times','FontSize',18,'box','on')
set(gca,'Ytick',[1e-4 1e-3 1e-2 1e-1 1],'Yscale','log')
text(0.15,5e-7,'Wavevector transfer Q (Å^{-1})',...
   'FontName','Times','FontSize',18,'horizontalalignment','center')
text(-0.05,1,'Reflectivity','FontName','Times',...
   'FontSize',18,'horizontalalignment','center','rotation',90)
text(0.20,0.7,'(b) Parratt','FontName','Times','FontSize',16)

%----- kinematical reflectivity

sld=bl;
sigma=0; N=10; Lambda=50; Gamma=0.2;

R=kinematicalR(Q,lambda,sld,sigma,N,Lambda,Gamma);

axes('position',[0.2 0.55 0.7 0.4]); line(Q,R)
set(gca,'FontName','Times','FontSize',18,'box','on')
axis([0 0.3 8e-6 2]);
set(gca,'Xticklabel','')
set(gca,'Ytick',[1e-4 1e-3 1e-2 1e-1 1],'Yscale','log')
text(0.20,0.7,'(a) Kinematical ','FontName','Times','FontSize',16)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [R]=kinematicalR(Q,lambda,sld,sigma,N,Lambda,Gamma)
%
% MATLAB function from:
% "Elements of Modern X-ray Physics" by Jens Als-Nielsen and Des McMorrow
%
% Calculates: kinematical reflectivity of a multilayer
% Inputs:  Q       wavevector transfer            1/Angs
%          lambda  wavelength of radiation        Angs
%          sld     scattering length density      1/Angs^2
%                  sld=[sldA+i*muA sldB+i*muB]    
%          sigma   rouhgness                      Angs
%          N       number of bilayers
%          Lambda  length of bilayer              Angs
%          Gamma   fraction of bilayer that is A
% Outputs: R       Intensity reflectivity

muA=imag(sld(1));
muB=imag(sld(2));

Dsld=real(sld(1))-real(sld(2));

zeta=Q/2/pi*Lambda;

beta=2*Lambda*Lambda*(muA*Gamma+muB*(1-Gamma))/lambda./zeta;

r_1=-2*i*Dsld*Lambda*Lambda*Gamma./zeta;
r_1=r_1.*sin(pi*Gamma*zeta)./(pi*Gamma*zeta);

r_N=r_1.*(1-exp(i*2*pi*zeta*N).*exp(-beta*N))./(1-exp(i*2*pi*zeta).*exp(-beta));

r_N=r_N.*exp(-((Q*sigma).^2/2));
R=r_N.*conj(r_N);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [RR]=parratt(Q,lambda,sld,d,sigma)
%
% MATLAB function from:
% "Elements of Modern X-ray Physics" by Jens Als-Nielsen and Des McMorrow
%
% Calculates: Parratt reflectivity of a multilayer
% Inputs: Q      wavevector transfer                1/Angs
%         lambda wavelength of radiation            Angs
%         sld    scattering length density          1/Angs^2
%                sld=[sld1+i*mu1 sld2+i*mu2 ....]
%         d      thickness of layer                 Angs
%                d=[d1 d2 .....];
%         sigma  rouhgness                          Angs
% Outputs:R      Intensity reflectivity

k=2*pi/lambda;

%----- Calculate refractive index n of each layer

delta=lambda^2*real(sld)/(2*pi); beta=lambda/(4*pi)*imag(sld);
n=size(sld,2);
nu=1-delta+i*beta;

%----- Wavevector transfer in each layer

Q=reshape(Q,1,length(Q));
x=asin(Q/2/k);
for j=1:n
   Qp(j,:)=sqrt(Q.^2-8*k^2*delta(j)+i*8*k^2*beta(j));  
end
Qp=[Q;Qp];

%----- Reflection coefficients (no multiple scattering)

for j=1:n
   r(j,:)=((Qp(j,:)-Qp(j+1,:))./(Qp(j,:)+Qp(j+1,:))).*...
      exp(-0.5*(Qp(j,:).*Qp(j+1,:))*sigma(j)^2);
end

%----- Reflectivity from first layer

RR=r(1,:);
if n>1
   R(1,:)=(r(n-1,:)+r(n,:).*...
      exp(i*Qp(n,:)*d(n-1)))./(1+r(n-1,:).*r(n,:).*exp(i*Qp(n,:)*d(n-1)));
end

%----- Reflectivity from more layers

if n>2
  for j=2:n-1
     R(j,:)=(r(n-j,:)+R(j-1,:).*...
        exp(i*Qp(n-j+1,:)*d(n-j)))./(1+r(n-j,:).*R(j-1,:).*exp(i*Qp(n-j+1,:)*d(n-j)));
  end
end

%------ Intensity reflectivity

if n==1
  RR=r(1,:);
else
  RR=R(n-1,:);
end

RR=(abs(RR).^2)';






 


Das gibt mir eine nette Kurve, die mich glücklich macht! Smile

und nun nochmal ohne function (ich habe den "kinematical" Teil rausgenommen, nur die Konstanten davon mitgenommen:

Code:

r0=2.82e-5;                             % Thompson scattering length in Angs
Q=0.01:0.001:0.3;                       % Wavevector transfer in 1/Angs
lambda=1.54;                            % wavelength in Angs
rhoA=4.678; muA=33.235e-6;              % density and absorption coefficient of W
rhoB=0.699; muB=1.399e-6;               % density and absorption coefficient of Si

bl=[rhoA*r0+i*muA rhoB*r0+i*muB];                 % bilayer scattering factor  
dbl=[10 40];                                      % bilayer d-spacings
ml=[bl bl bl bl bl bl bl bl bl bl 0.1e-20];       % multilayer scattering factor
dml=[dbl dbl dbl dbl dbl dbl dbl dbl dbl dbl];    % multilayer d-spacings
sml=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];  % roughness at each interface

k=2*pi/lambda;
sld=bl;
sigma=0; N=10; Lambda=50; Gamma=0.2;

%----- Calculate refractive index n of each layer

delta=lambda^2*real(sld)/(2*pi); beta=lambda/(4*pi)*imag(sld);
n=size(sld,2);
nu=1-delta+i*beta;

%----- Wavevector transfer in each layer

Q=reshape(Q,1,length(Q));
x=asin(Q/2/k);
for j=1:n
   Qp(j,:)=sqrt(Q.^2-8*k^2*delta(j)+i*8*k^2*beta(j));  
end
Qp=[Q;Qp];

%----- Reflection coefficients (no multiple scattering)

for j=1:n
   r(j,:)=((Qp(j,:)-Qp(j+1,:))./(Qp(j,:)+Qp(j+1,:))).*...
      exp(-0.5*(Qp(j,:).*Qp(j+1,:))*sigma(j)^2);
end

%----- Reflectivity from first layer

RR=r(1,:);

R=RR;

if n>1
   R(1,:)=(r(n-1,:)+r(n,:).*...
      exp(i*Qp(n,:)*d(n-1)))./(1+r(n-1,:).*r(n,:).*exp(i*Qp(n,:)*d(n-1)));
end

%----- Reflectivity from more layers

if n>2
  for j=2:n-1
     R(j,:)=(r(n-j,:)+R(j-1,:).*...
        exp(i*Qp(n-j+1,:)*d(n-j)))./(1+r(n-j,:).*R(j-1,:).*exp(i*Qp(n-j+1,:)*d(n-j)));
  end
end

%------ Intensity reflectivity

if n==1
  RR=r(1,:);
else
  RR=R(n-1,:);
end

RR=(abs(RR).^2)';

axes('position',[0.2 0.15 0.7 0.4]); line(Q,R)
axis([0 0.3 8e-6 2]);
set(gca,'FontName','Times','FontSize',18,'box','on')
set(gca,'Ytick',[1e-4 1e-3 1e-2 1e-1 1],'Yscale','log')
text(0.15,5e-7,'Wavevector transfer Q (Å^{-1})',...
   'FontName','Times','FontSize',18,'horizontalalignment','center')
text(-0.05,1,'Reflectivity','FontName','Times',...
   'FontSize',18,'horizontalalignment','center','rotation',90)
text(0.20,0.7,'(b) Parratt','FontName','Times','FontSize',16)
 


Da bekomme ich einge Fehler, die mich verwirren:

1. ??? Attempted to access sigma(2); index out of bounds because
numel(sigma)=1. - Warum kommt der fehler in der function-Version des codes nicht vor? Sigma=0 und damit kein Element mit mehreren Einträgen.

Behebe ich diesen Fehler, so kommt auch schon der Nächste:

2. ??? Undefined function or method 'd' for input arguments of type 'double'.
Das selbe wie mit sigma, nur ist 'd' überhaupt nicht gegeben!

Ich habe das Gefühl, dass mir eine Matlab-Grundlage entgangen ist...
Woher nimmt matlab 'd' und 'sigma'?

Das File habe ich hier gefunden: http://www.cmmp.ucl.ac.uk/~demc/emxp/MATLABfiles/par_kin.m

Danke für eure Mühe,
Oleg.


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.10.2011, 14:38     Titel:
  Antworten mit Zitat      
Hier wird mit dem Index j auf einen Vektor oder eine Matrix sigma(j)zugriffen...Sigma ist aber als Skalar definiert (weiter oben im code: sigma = 0)!

Code:

for j=1:n
    r(j,:)=((Qp(j,:)-Qp(j+1,:))./(Qp(j,:)+Qp(j+1,:))).*...
       exp(-0.5*(Qp(j,:).*Qp(j+1,:))*sigma(j)^2);
end
 


Hast du eine Funktion/m-file mit dem Namen d im Work-Verzeichnis?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gelo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2011, 14:50     Titel:
  Antworten mit Zitat      
Danke für deine Antwort!

Es ist klar, dass mit sigma=0 ein zugriff auf sigma(j) keinen sinn macht!

Im work-verzeichniss ist keine datei namens 'd' dabei, hab zur sicherheit die function-version nochmal angelegt in einem leeren ordner, ist weiterhin unverändert!
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.10.2011, 15:08     Titel:
  Antworten mit Zitat      
Sorry...ich hatte deinen ersten Post wohl etwas zu schnell überfolgen.
In der Funktion par_kin erfolgt folgender Aufruf:

Code:

R=parratt(Q,lambda,ml,dml,sml);
% Funktionskopf weiter unten im code
function [RR]=parratt(Q,lambda,sld,d,sigma)
 


Somit ist der Vektor sml in der Funktion = sigma und deshalb geht auch der Zugriff auf sigma(j). Das Gleiche gilt bei...dml = d innerhalb der Funktion parratt Wink

sigma = 0 aus par_kin hat nichts mit sigma(j) innerhalb der Funktion parret zu tun!
Private Nachricht senden Benutzer-Profile anzeigen
 
Gelo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2011, 15:13     Titel:
  Antworten mit Zitat      
Ah, ok, achso!
Danke!
Daher kommt das also! Ich muss kurz mal was ausprobieren... Smile
 
Gelo

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2011, 15:23     Titel:
  Antworten mit Zitat      
wenn ich nun im 'function-losen' file sigma=0 lösche,

Code:
sigma=sml;
d=dml;


und

Code:


einfüge, bekomme ich aber ein anderes ergebniss also in der Function-version - wie kommt das? Alle rechnungen und variabeln sind gleich!
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.10.2011, 15:58     Titel:
  Antworten mit Zitat      
Zitat:
...bekomme ich aber ein anderes ergebniss also in der Function-version - wie kommt das? Alle rechnungen und variabeln sind gleich!


Das halte ich für ein Gerücht Wink Schon mal nach sld geschaut?

sld wird bei den Definitionen sld = bl gesetzt...in der Funktion parrett wird aber für sld = ml übergeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gelo
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 10.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2011, 16:30     Titel:
  Antworten mit Zitat      
Stimmt!
Nun macht er, wie ich will! Danke! Nun mach ich aber weiter, mit meinen "Wabbelfunktionen" Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.