Gelöste Aufgaben/LA01: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 20: | Zeile 20: | ||
<!--------------------------------------------------------------------------------> | <!--------------------------------------------------------------------------------> | ||
{{MyCodeBlock|title= | {{MyCodeBlock|title=Header | ||
|text= | |text= | ||
Wir machen zwei Schritte zur Lösung: | Wir machen zwei Schritte zur Lösung: |
Aktuelle Version vom 1. April 2021, 09:09 Uhr
Aufgabenstellung
Hier unternehmen wir einen Ausflug in die - und ihre Verbindung zu Minimalprinzipen und der.
Dabei sollen Parameter eines Produktions-Systems indentifiziert werden.
Eine Maschine produziert die Werkstücke "a" und "b" in einer 8h-Schicht. Die Anzahl der produzierten Werkstücke ist gegeben. Die Rüstzeit für beide Werkstücke an der Maschine sei gleich.
Gesucht ist die Bearbeitungsdauern jeweils für Werkstück a und b. Die Liste der produzierten Werkstücke erzeugen wir uns mit Matlab mit einer Zufalls-Funktion.
Lösung mit Maxima
Header
Wir machen zwei Schritte zur Lösung:
- die Formulierung des Problems als lineares Gleichungssystem, bei der wir nur die ersten drei Produktionstage berücksichtigen.
- die Formulierung des Problems als "Gaußschen Methode der kleinsten Quadrate".
/*******************************************************/
/* MAXIMA script */
/* version: wxMaxima 15.08.2 */
/* author: Andreas Baumgart */
/* last updated: 2018-10-16 */
/* ref: Lineare Gleichungssyteme in der Fertigung */
/* description: describe problem in terms of linear */
/* algebra and the least square method */
/*******************************************************/
Declarations
Die vorgegebene Anzahl der je Werktag produzierten Werkstücke sei z.B.:
Diese Liste erzeugen wir - bis auf die ersten drei - jeweils neu mit einer Zufallsvariablen in Excel. Die Ergebnisse sehen also jedes Mal etwas anders aus.
/* Referenz-Lösung*/
P: [1/2, 3/4, 1/2];
/* aufgezeichnete Anzahl von Werkstücken */
n : [[(8- 1 - 8*P[2])/P[1],8],
[(8- 1 - 2*P[2])/P[1],2],
[(8-1/2- 0*P[2])/P[1],0]];
/* zufällige Liste für Werkstück a erzeugen */
data: makelist(random(15),i,1,10);
timeleft: makelist( 8+1/2
-data[i]*P[1]
-(if data[i]>0 then 1 else 0)*P[2],i,1,length(data));
data: makelist([data[i],
if timeleft[i]>P[2]+P[3] then floor((timeleft[i]-P[3])/P[2]) else 0],
i,1,length(data));
n : append(n,data);
Preparation
Wir brauchen ein Modell für den Produktionsprozess am Tag "i".
Wir nehmen an, dass an jedem Tag zuerst die Werkstücke "a" (blau) und dann die Werkstücke "b" (grün) produziert werden. Wenn ein neues Werkstück produziert wird, muss die Maschine vorher eingerüstet werden.
Die Produktionsdauer für alle Werkstücke "a" am Tag i ist also
mit der Anzahl der produzierten Werkstücke "a" von Ni1.
Gleiches gilt für die Werkstücke "b".
Wenn sowohl Werkstücke "a" als auch "b" produziert werden, erfordert dies zwei Rüstzeiten - sonst eine. Für die gesamte Rüstzeit je Tag gilt also:
- .Wir erweitern deshalb unsere Tabelle um die Anzahl der Rüstzeiten je Tag und erhalten
Für den ersten der I Tage lautet also die Gleichung für den Produktionsprozess:
- .
/* include Rüstzeit */
n : makelist([n[i][1],n[i][2],
(if n[i][1]>0 then 1 else 0)+
(if n[i][2]>0 then 1 else 0)],i,1,length(n));
First Approach
Wir können nun für jeden Tag eine lineare Gleichung wir oben formulieren.
Wir suchen allerdings nur drei Größen, nämlich
Als ersten Ansatz nutzen wir die ersten drei Gleichungen und ignorieren zunächst die restlichen. Unser lineares Gleichungssystem sieht dann so aus:
- .
Das Gleichungssystem hat eine Lösung, wenn die Determinante der 3x3-Matrix nicht Null ist (darum geben wir die ersten drei Listen-Elemente vor und lassen sie nicht durch einen Zufallsgenerator erzeugen ...). Die Lösung des Gleichungssystems lautet
- .
Der Nachteil dieser Lösung: sie gilt für die ersten drei Gleichungen. Wie sieht es mit den anderen Gleichungen (Tagen) aus? wir berechnen den Fehler je Tag:
/* gesuchte Größen */
t : transpose(makelist(T[j],j,1,3));
/* nur die ersten drei nehmen … */
print(funmake('matrix,([n[1],n[2],n[3]])),"∙",t,"=",transpose(r))$
sol: solve(makelist(n[i].t=r[i],i,1,3),[T[1],T[2],T[3]])[1];
Best Statistical Solution
Mit unserem ersten Ansatz müssen wir also für jeden Tag - außer den ersten dreien - mit einem Fehler in den ermittelten Bearbeitungsdauern Ti rechnen. Was wir besser machen können: Wir fragen nach den Bearbeitungsdauern,
die den Fehler im statistischen Mittel über alle Tage minimieren.
Grundlage dafür ist der Fehler ei je Tag, also
- .
Damit nicht der Fehler an einem Tag den Fehler an einem anderen Tag numerisch kompensiert (also wenn z.B. e3 + e17 = 0), sollen alle Fehler positiv eingehen. Statt den Betrag von ei zu verwenden, nimmt man ei2 (das Fehler-Quadrat) und erhält als Gesamtfehler-Funktion
- .
Diese Gesamtfehler-Funktion ist minimal, wenn
- .
Numerisch mach es mehr Sinn, das Problem umzuformulieren. Dazu schreiben wir ei als
und damit
- .
Dann ist
- .
Mit unseren Zahlen finden wir
- .
Aus dem Abschnitt Minimum Prinzipe kennen wir die Struktur der Gesamtfehler-Funktion - wir können deshalb den Lösungs-Algorithmus für das Minimum-Problem von dort übernehmen und erhalten aus
die Losung
- .
/* define error function */
row: e[i]=(sum(N[i,j]*T[j],j,1,3)-D[i])^2;
row : expand(subst(row,e[i]));
null: makelist(T[j]=0,j,1,3);
c : subst(null,row);
row: row-c;
b : subst(null,makelist(coeff(row,T[j],1),j,1,3));
row: row-b.t;
load(diag)$
A : 1/2*makelist(coeff(makelist(coeff(row,T[j],1),j,1,3),T[k]),k,1,3)
+ diag(makelist(coeff(row,T[j],2),j,1,3));
row: expand(row-transpose(t).A.t);
print(e[i]," = ", 1/2,transpose(t),"∙2",A,"∙",t,"+",transpose(t),"∙",transpose(b),"+",c)$
Alpha : [[0,0,0],[0,0,0],[0,0,0]];
Beta : [0,0,0];
Alpha : 2*sum(subst([N[i,1]=n[j][1],N[i,2]=n[j][2],N[i,3]=n[j][3]],A),j,1,length(n));
Beta : sum(subst([N[i,1]=n[j][1],N[i,2]=n[j][2],N[i,3]=n[j][3], D[i]=8],b),j,1,length(n));
sol: [sol,solve(makelist(Alpha[j].t + Beta[j]=0,j,1,3),[T[1],T[2],T[3]])[1]]
Lösung mit Matlab
Dazu gibt es auch ein Skript zur Bearbeitung mit Matlab. Das wird näher in
beschreiben.
% MATLAB script %
% version: wxMaxima R2015a %
% author: Andreas Baumgart %
% last updated: 2018-11-01 %
% elfe-platform.atlassian.net/wiki/spaces/TTM/pages/821362915/LA01 %
% description: find best statistical production %
% durations for %
% workpiece "a", "b" and setup-time %
% ***************************************************** %
% look in "Functions" for functions
addpath('Functions');
%% Step 1: Pre-Process %
% read from file
fileName = 'records.xlsx';
[data, D, A, b, c] = preProcess(fileName);
%% Step 2: Solve %
t = linsolve(A,-b);
%% Step 3: Post-Process
postProcess(data, D, t);
%% END %
Das vollständige Projekt
Das vollständige Projekt können Sie hier herunterladen.
download compressed archive →
Messwerte
Die "Messwerte" für die Bearbeitung mit Matlab erzeugen wir - bis auf die ersten drei - jeweils neu mit einer Zufallsvariablen in Excel.
Die Ergebnisse sehen also jedes Mal etwas anders aus; z.B. so:
download spreadsheet →
Links
Literature
- ...