Gelöste Aufgaben/LA01

Aus numpedia
Zur Navigation springen Zur Suche springen


Aufgabenstellung

Hier unternehmen wir einen Ausflug in die - und ihre Verbindung zu Minimalprinzipen und der.

Dabei sollen Parameter eines Produktions-Systems indentifiziert werden.

Werkzeugmaschine

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

Title

Wir machen zwei Schritte zur Lösung:

  1. die Formulierung des Problems als lineares Gleichungssystem, bei der wir nur die ersten drei Produktionstage berücksichtigen.
  2. 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".

Phasenmodell

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:

.
Tabelle erweitert um Rüstzeiten
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                                                  %




Messwerte

Die "Messwerte" für die Bearbeitung mit Matlab erzeugen wir - bis auf die ersten drei - jeweils neu mit einer Zufallsvariablen in Excel.

Fehlerfunktion

Die Ergebnisse sehen also jedes Mal etwas anders aus; z.B. so:

data
download spreadsheet →



Links

Literature

  • ...