Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

MATLAB 7 für Ingenieure: Grundlagen und Programmierbeispiel

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zahl suchen, die Wert am nächsten ist

 

Philipp68
Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 18.07.2020, 18:14     Titel: Zahl suchen, die Wert am nächsten ist
  Antworten mit Zitat      
Hallo,

ich habe eine Liste von Frequenzen 0.1:0.1:25 Hz. Von diesen habe ich mir die Periodendauer ausgeben lassen.
Ich habe nun einen zweiten Vektor mit den Zahlen Pt = 3759:20000.

Code:

% Frequenz
f_start = 0.1;
f_end = 25;
f = f_start:0.1:f_end; % Frequenz
[~,size_f] = size(f);

% Periodendauer
T = zeros(1,size_f);
for i = 1:size_f
T(1,i) = (1/(2*f(1,i)))*1000000; % Periodendauer
end

% Zeitliche Range für DMD
Pt = 3759:20000; % Range für Pt
[~,size_Pt] = size(Pt);
 


Ich muss jetzt einen Faktor x suchen, der einen Wert zwischen 3759-20000 so multipliert, dass er der Periodendauer(1,i) am nächsten ist.
Suche für jede Periodendauer das beste Pt*x. Pt und x dürfen keine Dezimalzahlen sein!

Gibt es dazu eine Funktion in Matlab, die mir diesen Wert automatisch sucht?
Sonst wäre meine Idee verschiedene Teiler = T/Pt zu suchen, die den kleinsten Fehler aufzeigen. Diese Position in Pt suchen und damit multiplizieren.

Vllt gibt es noch eine bessere Variante?
Vielen Dank Smile
Private Nachricht senden Benutzer-Profile anzeigen


Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 19.07.2020, 16:03     Titel:
  Antworten mit Zitat      
Falls noch jemanden interessiert wie die Ergebnisse sind oder das für einen ähnlich Fall benutzen möchte ist hier nochmal die komplette Variante Very Happy
Der Fehler bei dieser Variante befindet sich im Tausendstelbereich bzw für meinen Fall im mHz Bereich. Denke das ist ein gutes Resultat.

Code:

% Frequenz
f_start = 0.1;
f_end = 25;
f = f_start:0.1:f_end; % Frequenz
[~,size_f] = size(f);

% Periodendauer
T = zeros(1,size_f);
for i = 1:size_f
T(1,i) = (1/(2*f(1,i)))*1000000; % Periodendauer
end

% Zeitliche Range für DMD
Pt = 3759:15000; % Range für Pt
[~,size_Pt] = size(Pt);

% Periodendauer durch Range teilen
for k = 1:size_f
    for m = 1:size_Pt
       
        Divisor(k,m) = T(1,k)/Pt(1,m);

    end
end

Divisor_nearest = nearest(Divisor);

Divisor_diff = abs(Divisor-Divisor_nearest);

for k = 1:size_f
   [Error_value(k,:),Error_pos(k,:)] = min(Divisor_diff(k,:));        
end

for k = 1:size_f
Divisor_find(k,1) = Divisor(k,Error_pos(k,:));
end

Divisor_find = round(Divisor_find);

for k = 1:size_f
Pt_find(k,1) = Pt(1,Error_pos(k,:));
end


T_find = Divisor_find.*Pt_find;

% Neue Frequenz
f_find = zeros(1,size_f);
for i = 1:size_f
f_find(1,i) = (1 /(2*T_find(i,1)))*1000000;
end



figure;
subplot(2,2,1)
plot(f);
% xticks(1:10:250);
% xticklabels(0:1:25);
yticks(1:1:25);
ylabel('Frequence (Hz)');
xlabel('Number of Frequences');
title('Frequence');
set(gca,'fontsize',12);

subplot(2,2,2)
plot(f_find,'r');
yticks(1:1:25);
ylabel('Frequence (Hz)');
xlabel('Number of Frequences');
title('Created Frequence');
set(gca,'fontsize',12);

subplot(2,2,3)
plot(T/10^6);
xticks(1:10:250);
xticklabels(0:1:25);
ylabel('Period Time (s)');
xlabel('Frequence (Hz)');
title('Period Time');
set(gca,'fontsize',12);

subplot(2,2,4)
plot(T_find/10^6,'r');
xticks(1:10:250);
xticklabels(0:1:25);
xlabel('Frequence (Hz)');
ylabel('Period Time (s)');
title('Created Period Time');
set(gca,'fontsize',12);


figure;
hold on
yyaxis left
plot(Divisor_find,'o-')
xticks(1:10:250);
xticklabels(0:1:25);
xlabel('Frequence (Hz)');
ylabel('Multiplier');
yyaxis right
plot(Pt_find/10^6,'o-');
xticks(1:10:250);
xticklabels(0:1:25);
xlabel('Frequence (Hz)');
ylabel('PictureTime/illuminateTime (s)');
legend('Value Multiplier','Value for PictureTime/illuminateTime');
set(gca,'fontsize',15);
hold off

figure;
f_diff = abs(f-f_find);
plot(f_diff,'o-');
xticks(1:10:250);
xticklabels(0:1:25);
xlabel('Frequence (Hz)');
ylabel('Period Time Difference (s)');
title('Difference between real und created period time')
set(gca,'fontsize',15);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 21.850
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.07.2020, 19:46     Titel:
  Antworten mit Zitat      
Hallo,

generell würde ich versuchen, die Vektorisierung von MATLAB besser auszunutzen, z.B.

Code:
% Periodendauer
T = zeros(1,size_f);
for i = 1:size_f
T(1,i) = (1/(2*f(1,i)))*1000000; % Periodendauer
end

könnte man auch schreiben als
Code:
T = 1./(2*f) * 1000000;


oder
Code:
% Periodendauer durch Range teilen
for k = 1:size_f
    for m = 1:size_Pt
       
        Divisor(k,m) = T(1,k)/Pt(1,m);

    end
end

als
Code:
Divisor = T' ./ Pt;


Im übrigen wäre ich vorsichtig: dass der Fehler im Divisor minimal ist, heißt nicht, dass er auch in der Multiplikation minimal ist.

Meine Idee wäre:
startend bei k = 0
Solange für T(i) \pm k die Division durch keines der Pt restfrei aufgeht, wird k erhöht.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Philipp68
Themenstarter

Forum-Century

Forum-Century


Beiträge: 148
Anmeldedatum: 21.10.15
Wohnort: Mannheim / Ilmenau
Version: R2014a, R2017a, R2019b
     Beitrag Verfasst am: 20.07.2020, 11:54     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:

Im übrigen wäre ich vorsichtig: dass der Fehler im Divisor minimal ist, heißt nicht, dass er auch in der Multiplikation minimal ist.


Hallo Harald, Danke für deinen Hinweis! Du hast recht, das ist mir auch in den Sinn gekommen und deshalb hatte ich mir noch die Gesamtdauer anschaut, die durch die Multiplikation entsteht. Um wie viel sich die erzeugte Periodendauer von der gewünschten unterscheidet. Dafür habe ich auch das zeitliche Intervall 3,759-20ms auf 3,759-15ms, 3,759-10ms und 3,759-5ms kleiner gemacht, um zu sehen was passiert. Habe es mal als Datei hinzugefügt und die Unterschiede sind sehr klein.
Man sieht, wird das Intervall kleiner, wird der Fehler aufgrund der geringen Kombinationsmöglichkeiten größer und somit der zeitliche Unterschied zwischen der gewollten und erzeugten Periodendauer größer.

Zu deiner Überlegung, das habe ich davor schon mal probiert und um restfreie Variablen zu erhalten, bei 300 Frequenzen (0.1:0.1:30 Hz, Vorgabe) erhielt ich nur 13 Stück.

Total_PeriodTime_20000.png
 Beschreibung:

Download
 Dateiname:  Total_PeriodTime_20000.png
 Dateigröße:  89.96 KB
 Heruntergeladen:  10 mal
Total_PeriodTime_15000.png
 Beschreibung:

Download
 Dateiname:  Total_PeriodTime_15000.png
 Dateigröße:  88.66 KB
 Heruntergeladen:  9 mal
Total_PeriodTime_10000.png
 Beschreibung:

Download
 Dateiname:  Total_PeriodTime_10000.png
 Dateigröße:  86.91 KB
 Heruntergeladen:  7 mal
Total_PeriodTime_5000.png
 Beschreibung:

Download
 Dateiname:  Total_PeriodTime_5000.png
 Dateigröße:  92.55 KB
 Heruntergeladen:  6 mal
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.