Hallo, ich schreibe ein Programm, welches den Prozess des Verbrennungsmotors simulieren soll. Zuerst rechnet man mit "technischer" Thermodynamik und dann soll man das Ganze mit "chemischer" Thermodynamik machen. Dabei muss man nur eine Variable umändern und eine neue hinzufügen. Allerdings verwendet man mehrere Unterfunktionen, d.h. ich berechne mir die Größe in einer Unterfunktion, gebe diese an das Hauptprogramm zurück und rufe sie in der nächsten Unterfunktion wieder auf. Er schreit aber jedes mal, das er die Variable, welche ich zwischen den Unterfunktionen schieben möchte, nicht erkennt.
Das ist der Aufruf der Unterfunktion Combustion (dwi möchte ich weitergeben):
function [w, m, dwi] = ...
combustion(qSum, dPhiCD, mVIBE, phi, phiSOC, dphi, ...
mMix, LHV, m, w, dwf, nspec)
Das ist der Aufruf der Unterfunktion Energy:
function [dq, dwth, du, dT] = ...
energy(dqWall, p, dV, mMix, cvMix, u, dwi)
Und das ist der Aufruf der Unterfunktion Fluid:
function [hMix, uMix, cpMix, cvMix, kappaMix, sMix, RMix, u] = fluid( T, nspec, R, w, NASA, M, p, pRef)
Ich muss in Energy berechnen: dT = (du - dot(u,dwi))/cvMix;
bei Problemen aller Art is es immer hilfreich, wenn das Beispiel reproduzierbar ist.
Hier fehlen mir zumindest die Aufrufe der Funktionen. Damit du dwi für den Aufruf von energy verwenden kannst, muss es ja zuvor (im selben Workspace) erzeugt worden sein, z.B. durch einen Aufruf von combustion. Ist dieser Aufruf von combustion da, und wie sieht er aus?
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 ;)
dwth = -(p*dV/mMix); %Instantaneous work increase
du = dq+dwth; %Instantaneous internal energy increase
dHu = dot(dwi,uChem); ----> hier passiert die Fehlermeldung!!!!
dT = (du-dHu)/cvMix; %Instantaneous temperature increase
end
(Aus dieser Funktion hole ich mir nur das schon berechnete u, wobei ich es ganz unten nach dem Ende der IF- Schleife zu uChem umbennene):
Code:
function[hMix, uMix, cpMix, cvMix, kappaMix, sMix, RMix, uChem] = fluid( T, nspec, R, w, NASA, M, p, pRef) % Caloric properties of the species (Definition of the reference enthalpy acc. to the % NASA tables)
h = zeros(1,nspec);
cp = zeros(1,nspec);
s = zeros(1,nspec);
cv = zeros(1,nspec);
u = zeros(1,nspec);
% allgemeine Gaskonstante in J/(mol*K)
Rm = 8.31451;
%molare Masse des Gemisches in g/mol
S = sum(w./M);
Mgem = 1/S;
if T < 1000
zeile = 0;
elseif T > 1000
zeile = 1;
end
Ich habe allerdings das Problem, dass mir folgendes passiert: dwi und uChem sind 1x7 Vektoren. Die Unterfunktionen kann ich schön übergeben, da habe ich mittlerweile keine Probleme mehr. Allerdings erscheint mit eine Fehlermeldung, wenn ich in der Unterfunktion energy den Befehl "dot(dwi, uChem)" tippe (bei der Berechnung von dHu- siehe oben bei Unterfunktion energy), da macht er mir aus dem dwi einen 1x1 Vektor mit Eintrag null und sagt:
Error using dot (line 32) --> das ist die Zeile in der von Matlab geöffneten Funktion dot.m- in dieser steht: error(message('MATLAB:dot:InputSizeMismatch'));
da macht er mir aus dem dwi einen 1x1 Vektor mit Eintrag null
MATLAB verändert nicht einfach so Variablen.
dwi entsteht aus einem Aufruf von combustion (sofern denn combustion in der if-Anweisung überhaupt aufgerufen wird) und wird dann vermutlich schon dort 0 sein. Warum das so ist, kann ich ohne den ersten Teil des Hauptprogramms, in dem die Variablen gesetzt werden, nicht nachvollziehen.
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 ;)
das dwi wird schon aus der Unterfunktion combustion aufgerufen und in dieser ist auch eine IF- Abfrage. Aber trotzdem sollte dwi die Form des Vektors 1x7 beibehalten, egal ob dqComb null ist oder nicht. Wenn dqComb null wird, dann wird auch dwi null sein, aber dwi ist eben dann immer noch ein 1x7 Vektor (in dem Fall ein 1x7 Nullvektor).
Hier mein Hauptprogramm (elevant wird es eigentlich ab "Program Body"):
nspec = 7;
R = zeros(1,nspec);
M = zeros(1,nspec);
%--------------------------------------------------------------------------
% Air
M(1) = 28; %Mole mass N2 in g/mol
M(2) = 32; %Mole mass O2 in g/mol
for ii = 1:2
R(ii) = Rm / M(ii) * 1000; %Specific gas constants in J/kgK
end
xLN2 = 0.781; %Volume fraction nitrogen
xLO2 = 1 - xLN2; %Volume fraction oxygen
RAir = 1 / (xLN2/R(1) + xLO2/R(2)); %Specific gas constant air in J/(kgK)
MAir = xLN2 * M(1) + xLO2 * M(2); %Mole mass air in g/mol
wLN2 = xLN2 * M(1)/MAir; %Mass fraction nitrogen
wLO2 = xLO2 * M(2)/MAir; %Mass fraction oxygen
%--------------------------------------------------------------------------
% Exhaust Gas, Combustion Products, Intermediates
M(3) = 44; %Mole mass CO2 in g/mol
M(4) = 18; %Mole mass H2O in g/mol
M(5) = 28; %Mole mass CO in g/mol
M(6) = 2; %Mole mass H2 in g/mol
for ii = 3:6
R(ii) = Rm / M(ii) * 1000; %Specific gas constants in J/kgK
end
Kp = 3.6; %Constant for water gas reaction (equiv. ratio > 1)
%--------------------------------------------------------------------------
% Fuel
LHVf = 42.5e6; %Lower heating value gasoline in J/kg
LHVCO = 10.103e6; %Lower heating value CO in J/kg
LHVH2 = 119.9e6; %Lower heating value H2 in J/kg
nC = xlsread('XLSX-Data.xlsx', 'Fluid', 'M16'); %# of C-atoms per molecule, Heywood, p. 133
nH = xlsread('XLSX-Data.xlsx', 'Fluid', 'N16'); %# of H-atoms per molecule, Heywood, p. 133
MC = 12; %Mole mass carbon in g/mol
MH = 1; %Mole mass hydrogen in g/mol
M(7) = nC * MC + nH * MH; %Mole mass fuel in g/mol
R(7) = Rm / M(7) * 1000; %Specific gas constant fuel in J/(kgK)
hf = nH * MH / M(7); %Mass fraction H
cf = nC * MC / M(7); %Mass fraction C
nAir = 1/xLO2 * (0.5*hf/2 + cf/12); %Amount of air for stoichiometric combustion mol air / kg fuel
LSt = nAir * MAir; %Stoichiometric air/fuel ratio kg air / kg fuel
%--------------------------------------------------------------------------
% Caloric data
phiSOCCA = -25.; %Start of combustion in degree
phiSOC = phiSOCCA/180*pi; %Start of combustion in rad
dPhiCDCA = 102; %Combustion duration in degree
dPhiCD = dPhiCDCA / 180 * pi; %Combustion duration in rad
mVIBE = 1.27; %VIBE exponent
%**************************************************************************
% PROGRAM BODY
%**************************************************************************
%--------------------------------------------------------------------------
% Cylinder Charge Composition after inlet valve closing % Peparation of the composition and caloric properties
% INPUT: Charge and species' mass, overall fuel energy
mMix = pInit*VInit/(RMix*TInit); %Overall cylinder charge in kg
mInit = mMix*wInit;
qSum = LHV*mInit(7)/mMix; %Overall fuel energy
%**************************************************************************
% Calculation of the High Pressure Process
%**************************************************************************
% Simulation Start; Assignment of the Variables (t=0)
%--------------------------------------------------------------------------
% Calculation of the fluid properties over crank angle
%--------------------------------------------------------------------------
while phi <= phiEnd
%----------------------------------------------------------------------
%- Heat release and combustion, Mixture Composition during combustion
%----------------------------------------------------------------------
% INPUT: Conditions to call "combustion" if(phi >= phiSOC ) && (qComb <= 0.999*qSum) %Def. ofend of combustion
[w, m, dqComb, dwi] = ...
combustion(qSum, dPhiCD, mVIBE, phi, phiSOC, dphi, ...
mMix, LHV, m, w, dwf, nspec);
dphi = dPhiCD / CMultComb; %Time stepsizefor combustion
else
dqComb = 0.0;
dphi = dphiCA * pi / 180; %Time stepif there is no combustion
end
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 ;)
ja genau, das habe ich zum Schluss dann auch geändert.
Danke und LG,
Vido
Einstellungen und Berechtigungen
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
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.