Refactored

This commit is contained in:
2023-06-11 20:52:01 +02:00
parent e31347dac9
commit d7f4675772
+57 -17
View File
@@ -22,20 +22,27 @@
## Author: Jens <jens@orion>
## Created: 2023-06-08
function brewwater_optimizer (input1, input2)
function brewwater_optimizer (TEST_SUITE, k_ve)
# Load constants
water_constants()
k_ve = 0.25;
# Profile from tap water
k_Ca_0_mg = 94.0; % mg/l
k_Mg_0_mg = 18.1; % mg/l
k_Na_0_mg = 3.6; % mg/l
k_S_0_mg = 44.1; % mg/l
k_Cl_0_mg = 4.6; % mg/l
k_HCO3_0_mmol = 5.5; % mmol/l
m_Ca_0 = 94.0; % mg/l
m_Mg_0 = 18.1; % mg/l
m_Na_0 = 3.6; % mg/l
m_S_0 = 44.1; % mg/l
m_Cl_0 = 4.6; % mg/l
k_HCO3_0 = 5.5; % mmol/l
# Target Profile
k_Ca_1_mg = 50; % mg/l
k_Mg_1_mg = 20; % mg/l
k_Na_1_mg = 20; % mg/l
k_Cl_1_mg = 100; % mg/l
k_S_1_mg = 50; % mg/l
# Create common used compounds
M_CaSO4 = create_mol([i_Ca i_S i_O], [1 1 4], mol_masses)
M_CaCl2 = create_mol([i_Ca i_Cl], [1 2], mol_masses)
M_NaCl = create_mol([i_Na i_Cl], [1 1], mol_masses)
@@ -43,23 +50,56 @@ M_MgSO4 = create_mol([i_Mg i_S i_O], [1 1 4], mol_masses)
M_NaHCO3 = create_mol([i_Na i_H i_C i_O], [1 1 1 3], mol_masses)
M_H20 = create_mol([i_H i_O], [2 1], mol_masses)
# Create single elements
M_EL_Ca = create_mol([i_Ca], [1], mol_masses)
M_EL_Mg = create_mol([i_Mg], [1], mol_masses)
M_EL_Na = create_mol([i_Na], [1], mol_masses)
M_EL_Cl = create_mol([i_Cl], [1], mol_masses)
M_EL_S = create_mol([i_S], [1], mol_masses)
# Initial profile
M_Ca_0_mmol = k_Ca_0_mg/M_Ca; % mmol/l
M_Mg_0_mmol = k_Mg_0_mg/M_Mg; % mmol/l
M_Na_0_mmol = k_Na_0_mg/M_Na; % mmol/l
M_Cl_0_mmol = k_Cl_0_mg/M_Cl; % mmol/l
M_S_0_mmol = k_S_0_mg/M_S; % mmol/l
A = create_mol([i_Ca i_Mg i_Na i_Cl i_S], [M_Ca_0_mmol M_Mg_0_mmol M_Na_0_mmol M_Cl_0_mmol M_S_0_mmol], mol_masses)/5
# Target profile
M_Ca_1_mmol = k_Ca_1_mg/M_Ca; % mmol/l
M_Mg_1_mmol = k_Mg_1_mg/M_Mg; % mmol/l
M_Na_1_mmol = k_Na_1_mg/M_Na; % mmol/l
M_Cl_1_mmol = k_Cl_1_mg/M_Cl; % mmol/l
M_S_1_mmol = k_S_1_mg/M_S; % mmol/l
T = create_mol([i_Ca i_Mg i_Na i_Cl i_S], [M_Ca_1_mmol M_Mg_1_mmol M_Na_1_mmol M_Cl_1_mmol M_S_1_mmol], mol_masses)
if TEST_SUITE == 1,
# Allowed substances, easy
Pp = [M_EL_Ca; M_EL_Mg; M_EL_Na; M_EL_Cl; M_EL_S];
learning_rate = 0.01
end
if TEST_SUITE == 2,
# Allowed substances, difficult
Pp = [M_CaSO4; M_CaCl2; M_MgSO4; M_NaCl];
learning_rate = 0.001
end
# Init vecfit vars
[N_subst, N_elem] = size(Pp);
Pa = zeros(N_subst, 1);
# ignore oxygen
mask = create_mol([i_Ca i_Mg i_S i_Cl i_Na], [1 1 1 1 1], mol_masses) > 0
T = create_mol([i_Ca i_Mg i_Na i_S i_Cl], [0.05 0.01 0.02 0.05 0.10], mol_masses)
A = create_mol([i_Ca i_Mg i_Na i_S i_Cl], [0.094 0.018 0.004 0.044 0.005], mol_masses)
A = 0*T
Pa = [0 0 0 0]';
Pp = [M_CaSO4; M_CaCl2; M_MgSO4; M_NaCl];
V = 50; % liter
_dn = [];
CONV_COUNTER_RELOAD = 20;
Dn0 = 1;
conv_counter = CONV_COUNTER_RELOAD;
while true,
[A1, Pa, Dn1] = vecfit(Pp,mask,T,A,Pa, 0.001.*(1-exp(-Dn0)))
Dc = round_n(Dn1,3);
[A1, Pa, Dn1] = vecfit(Pp,mask,T,A,Pa, learning_rate.*(1-exp(-Dn0)))
Dc = round_n(Dn1,2);
if Dn0 == Dc,
if conv_counter == 0,
break;