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

Hilfe bei einfacher Programmierung

 

Henrik123
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 09.10.2017, 08:49     Titel: Hilfe bei einfacher Programmierung
  Antworten mit Zitat      
Hallo,

ich würde gerne folgendes Skript zum laufen bekommen.

Code:
clear all
close all

% Anregungsfrequenz in Hz
f=500
% Intervall für x in m
x=[0:1:1000]
% Anregungskraft in N
F0=1
% Output Vector
Ax = zeros(1, length (x))
Y = zeros(1, length (x))

%%
% Startparameter
% Lesser and Berkeley

% Funktionen der Modelle
% mx = 1.5 kg/m^2
% kx = 10^9 * exp(-3*x) N/m^3
% cx = 3000 * exp(-1.5*x) N/m^3

m1 = 1.5
k1 = 10.^9
k2 = -3
c1 = 3000
c2 = -1.5


%%
% % Startparameters
% % Neely
%
% % Funktionen der Modelle
% % mx = 0,5 kg/m^2
% % kx = 10^9 * exp(-2*x) N/m^3
% % cx = 200 N/m^33
%
% m1 = 0.5
% k1 = 10.^9
% k2 = -2
% c1 = 200
%
% mx=m1
% kx= k1* exp(k2*x)
% cx= c1

%%

% Auslenkungsamplitude

for i = 1:length(x)
   
    mx=m1
    kx= k1* exp(k2*i)
    cx= c1* exp(c2*i)
   
    Y(i) = cx.^2+(mx*2*pi*f-kx/(2*pi*f)).^2

    Ax(i) = F0/(2*pi*f*sqrt(Y(i)))
   
end


Es geht darum zwei Werte zu plotten. Einmal einen x-Wert welcher von 0 bis 1000 geht und die entsprechenden y-Werte hier als Ax verifiziert. Die Funktion Ax enthält eine Weitere Funktion Y. Komischerweise läuft die Schleife total lange. Und am Ende kommt nur murks raus. Habt ihr eine Idee?

Am liebsten würde ich ihn ja beide Modelle rechnen lassen, um vergleichen zu könne.

Mit freundlichem Gruß
Henrik123
Private Nachricht senden Benutzer-Profile anzeigen


Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 09.10.2017, 09:44     Titel:
  Antworten mit Zitat      
Der Wert Ax soll eine Auslenkung darstellen.

Die möchte ich für ein feste Frequenz 500 Hz über die Länge x 0cm bis 10 cm darstellen. Oder für eine feste Position x 10 cm über die Frequenzen f 0 bis 3000 Hz darstellen. Die Laufvariable ist dann entweder x oder f.

Leider bekomme ich immer wieder Probleme mit der Schleife.
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 09.10.2017, 12:42     Titel:
  Antworten mit Zitat      
Die gute Nachricht - wenn alle Zeilen mit einem Semikolon abgeschlossen werden und somit die Ausgabe ins Command Window unterdrückt wird - ist, dass der Code in wenigen Millisekunden durchläuft.

Die Schlechte: Ich weiß nicht was "Murks" in diesem Zusammenhang ist...

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 09.10.2017, 13:38     Titel:
  Antworten mit Zitat      
Oh man. Das hat mir schon sehr weiter geholfen. Jetzt ist er richtig flot ^^ Besten Dank. Ich melde mich nochmal sofern, mir noch was auffält. Da ich das in diesem Thread schreiben würde, wäre es klasse, wenn er auf bleiben dürfte.

Gruß Henrik123
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 09.10.2017, 14:46     Titel:
  Antworten mit Zitat      
Habe nun doch noch etwas entdeckt.

Ich habe einen Datensatz. Siehe Anhang. Ist eine kleine Excel-Datei. Sie enthält x-Werte (Position in m) in Spalte 1 und y-Werte (Auslenkung in m) in Spalte 2. Jetzt möchte ich meine Messpunkte fitten. Dazu habe ich mir folgendes überlegt.

Code:

clear all;
close all;

f0 = 400 ;       % Frequenz der Messung in Hz

F0 = 0.001;
m1 = 1.5;
k1 = 10.^9;
k2 = 3;
c1 = 3000;
c2 = 1.5;

a1 = [F0, m1, k1, k2, c1, c2];    % Startparameter für die Fitfunktion

%%
% Laden der Vergleichsdaten
filename = 'daten.xls';
A = xlsread(filename);

t = A(:,1)     %x-values
y = A(:,2)     %y-values

Fun = @(a1,xdata) a1(1)/(2*pi*f0*sqrt((a1(5)* exp(a1(6)*xdata)).^2+(a1(2)*2*pi*f0-((a1(3)*exp(a1(4)*xdata))/(2*pi*f0))).^2));
x = lsqcurvefit(Fun,a1,t,y);

hold all;

plot(t,Fun(x,t),'r', 'LineWidth',2)
plot(t,y,'k', 'LineWidth',2)
 


Vielleicht habt ihr ja noch eine Idee. Ich bekomme immer die Fehlermeldung:
Code:
Error using lsqcurvefit (line 251)
Function value and YDATA sizes are not equal.

Error in BM_Auslenkung (line 24)
x = lsqcurvefit(Fun,a1,t,y);
 

Besten Gruß
Henri123

Zuletzt bearbeitet von Henrik123 am 09.10.2017, 16:26, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 09.10.2017, 16:26     Titel:
  Antworten mit Zitat      
Habe jetzt erst gemerkt, dass die Endung xlsx verboten ist. Sorry.

daten.xls
 Beschreibung:

Download
 Dateiname:  daten.xls
 Dateigröße:  29 KB
 Heruntergeladen:  262 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 10.10.2017, 11:27     Titel:
  Antworten mit Zitat      
Ich habe mir den Code nochmal Stück für Stück angesehen, komme aber nicht auf den Fehler.

Zu erst definiere ich meine Startparameter und schreibe sie in einen Vektor.

Code:

clear all;
close all;
f0 = 400 ; % Frequenz der Messung in Hz

F0 = 0.001;
m1 = 1.5;
k1 = 10.^9;
k2 = 3;
c1 = 3000;
c2 = 1.5;

a1 = [F0, m1, k1, k2, c1, c2];    % Startparameter für die Fitfunktion


Dann lese ich die Daten ein und weiße sie einem Vektor zu.

Code:
% Laden der Vergleichsdaten
filename = 'daten.xlsx';
A = xlsread(filename);

xdata=A(:,1)     %x-values
ydata=A(:,2)     %y-values
 


Nun definiere ich die Funktion. Hier ist mir ein Fehler aufgefallen. Ich schreibe jetzt.

Code:
fun = @(x,xdata) x(1)/(2*pi*f0*sqrt((x(5)* exp(x(6)*xdata)).^2+(x(2)*2*pi*f0-((x(3)*exp(x(4)*xdata))/(2*pi*f0))).^2));

x = lsqcurvefit(fun,a1,xdata,ydata);


Vorher hate ich die Startwerte schon in die Funktion gesetzt. Leider bekomme ich immer noch die gleiche Fehlermeldung

Code:
Error using lsqcurvefit (line 251)
Function value and YDATA sizes are not
equal.

Error in BM_Auslenkung (line 27)
x = lsqcurvefit(fun,a1,xdata,ydata);
 


Ich freue mich über eine Anregung. Besten Gruß Henrik123
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 10.10.2017, 11:35     Titel:
  Antworten mit Zitat      
Habe ich die Funktion falsch eingegeben und da kommt ne Matrix raus. So im Sinne von .^ anstatt ^ oder .^ anstatt *?
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 10.10.2017, 13:20     Titel:
  Antworten mit Zitat      
Habe mich nochmal damit beschäftigt. Jetzt klappt es. Der Fehler war tatsächlich das Hochzeichen ^. Allerdings habe ich jetzt ein weiteres Problem.

Ich habe die Vergleichsdaten nochmal gemittelt, dadurch werden die Sprünge weniger. Nun möchte ich die Parameter für meine Funktion fitten lassen. Leider komme ich aber auf keine tolle Lösung. Der Fit liegt meilen weit davon entfernt. Gibt es da vielleicht noch eine andere Möglichkeit?

Code:
clear all;
close all;

f0 = 400 ;      % Frequenz der Messung in Hz

F0 = 0.001;     % kg
m1 = 0.1;       % kg/m^2
k1 = 10.^14;    % N/m^3
k2 = 0.3;       % 1/m
c1 = 1000;      % N*s/m^3
c2 = 0.3;       % 1/m

%%
% Laden der Vergleichsdaten
filename = 'daten.xls';
A = xlsread(filename);

xdata=1e3*A(:,1)    %x-values in mm
ydata=A(:,2)        %y-values in nm

%%
% Parametrierung und Fit

a1 = [F0, m1, k1, k2, c1, c2];                  % Startparameter für die Fitfunktion
lb = [1e-5, 0.001, 1e5, 0.003, 0.0001, 1e-7]    % Untere Grenze
ub = [1e-2, 1, 1e20, 30, 10000, 1000]           % Obere Grenze

fun = @(a,x) a(1)./(2*pi*f0*sqrt((a(5).*exp(a(6)*x)).^2+(a(2).*2*pi*f0-((a(3).*exp(a(4).*x))/(2*pi*f0))).^2));
options = optimset('TolX',1e-15,'TolFun',1e-15,'TypicalX', [[1e-3, 0.1, 1e14, 0.1, 1000, 0.1]]);

a = lsqcurvefit(fun,a1,xdata,ydata,lb,ub,options);

%%
% Plotten der Daten
hold all;
plot(xdata,ydata,'k*', 'LineWidth',2)
plot(xdata,fun(a,xdata),'r', 'LineWidth',2)
xlabel('Abstand in mm')
ylabel('Amplitude in m')


Besten Gruß Henrik123

daten.xls
 Beschreibung:

Download
 Dateiname:  daten.xls
 Dateigröße:  27.5 KB
 Heruntergeladen:  245 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 10.10.2017, 13:40     Titel:
  Antworten mit Zitat      
Habe die Fitfunktion noch verändern müssen. Vorzeichenfehler im Exponenten.

Alt
Code:
fun = @(a,x) a(1)./(2*pi*f0*sqrt((a(5).*exp(a(6)*x)).^2+(a(2).*2*pi*f0-((a(3).*exp(a(4).*x))/(2*pi*f0))).^2));


Neu
Code:
fun = @(a,x) a(1)./(2*pi*f0*sqrt((a(5).*exp(-a(6)*x)).^2+(a(2).*2*pi*f0-((a(3).*exp(-a(4).*x))/(2*pi*f0))).^2));


Für das Verständnis der Formel

https://www.zahlen-kern.de/editor/equations/fg5w.png
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 10.10.2017, 14:48     Titel:
  Antworten mit Zitat      
Habe jetzt mit etwas ausprobieren, folgende Startwerte herausbekommen.

Code:

f0 = 500 ; % Frequenz der Messung in Hz

F0 = 0.001;     % kg
m1 = 0.5;      % kg/m^2
k1 = 10.^10;    % N/m^3
k2 = 3;       % 1/m
c1 = 30000;      % N*s/m^3
c2 = 1.5;       % 1/m

lb = [1e-4, 1e-4, 1e-10, 1e-10, 1e-10, 1e-10]          % Test
ub = [1e-2, 1e-1, 1e10, 1e10, 1e10, 1e10]  


Ist es möglich, das automatisch zu machen, ohne rumprobieren? So komme ich irgendwie nicht weiter.

untitled.pdf
 Beschreibung:

Download
 Dateiname:  untitled.pdf
 Dateigröße:  4.11 KB
 Heruntergeladen:  300 mal


Zuletzt bearbeitet von Henrik123 am 10.10.2017, 14:58, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 10.10.2017, 14:50     Titel:
  Antworten mit Zitat      
Das Hauptproblem ist, dass meine Messdaten nur einen kleinen Bereich der Fitfunktion abdecken. Und zwar den Bereich nahe der Resonanz also dem Maximum.

Wie sage ich ihm, dass er nur hinsichtlich der Fehlerquadrate in der Nähe des Peaks schauen soll? Ist das überhaupt sinnig?

Für x gegen unendlich verläuft er eh konstant.
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 11.10.2017, 08:09     Titel:
  Antworten mit Zitat      
Kann man vielleicht auch Startwerte im Intervall lb und ub variabel ausgeben und ihn 100 oder 1000 mal plotten lassen, bis er vielleicht was findet?

Wie würde ich da Vorgehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Henrik123
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 87
Anmeldedatum: 25.01.17
Wohnort: ---
Version: 2011a, 2017a
     Beitrag Verfasst am: 14.10.2017, 16:07     Titel:
  Antworten mit Zitat      
Hat denn neimand eine Idee?
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 - 2024 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.