Com-langmuir model:
qi = Hi * Ci / (1 + Σ(bi * Ci)
i = 2, q and C was obtained from experiment, here is the data df
:
Column 1 |
Column 2 |
Column 3 |
Column 4 |
C_EA |
C_EC |
q_EA_303K |
q_EC_303K |
3.46 |
0.34 |
7 |
0.51 |
5.19 |
0.51 |
9.36 |
0.69 |
6.93 |
0.68 |
11.44 |
0.94 |
8.66 |
0.85 |
13.96 |
1.12 |
10.39 |
1.02 |
15.67 |
1.25 |
12.12 |
1.19 |
19.36 |
1.51 |
while H and b are parameters to be fitted. I’ve tried using Lsqfit.jl, But the results obtained were not ideal,how to use NonlinearSolve.jl to fit my parameters?@ChrisRackauckas, thanks in advance.
using NonlinearSolve
function f(du, u, p)
H_EA, b_EA, b_EC, H_EC = p
@. du[1] - H_EA * u[1] / (1 + b_EA * u[1] +b_EC * u[2] ) # du[1] = q_EA_303K, du[2] = q_EC_303K, u[1] = C_EA, u[2] = C_EC
@. du[2] - H_EA * u[2] / (1 + b_EA * u[1] +b_EC * u[2] )
end
Just build a NonlinearLeastSquaresProblem with that f
and solve. Did you give that a try? How did it do?
data = [df.C_EA df.C_EC df.q_EA_303K df.q_EC_303K]
6×4 Matrix{Any}:
3.46 0.34 7 0.51
5.19 0.51 9.36 0.69
6.93 0.68 11.44 0.94
8.66 0.85 13.96 1.12
10.39 1.02 15.67 1.25
12.12 1.19 19.36 1.51
function loss_function(p, data)
Ha, b_EA, b_EC, Hc = p
res1 = @. Ha * data[:, 1] / (1 + b_EA * data[:, 1] + b_EC * data[:, 2]) - data[:, 3] # data[:, 1] = C_EA, data[:, 2] = C_EC
res2 = @. Hc * data[:, 2] / (1 + b_EA * data[:, 1] + b_EC * data[:, 2]) - data[:, 4] # data[:, 3] = q_EA, data[:, 4] = q_EC,
return vcat(res1, res2)
end
p_init = [1.983, 0.0258, 0.2037, 1.53]
nlls_prob = NonlinearLeastSquaresProblem(loss_function, p_init, data)
res = solve(nlls_prob, LevenbergMarquardt(); maxiters = 1000, show_trace = Val(true),
trace_level = TraceWithJacobianConditionNumber(25))
Algorithm: LevenbergMarquardt(
trustregion = LevenbergMarquardtTrustRegion(β_uphill = 1.0),
descent = GeodesicAcceleration(descent = DampedNewtonDescent(initial_damping = 1.0, damping_fn = LevenbergMarquardtDampingFunction()), finite_diff_step_geodesic = 0.1, α = 0.75)
)
---- ------------- ----------- -------
Iter f(u) 2-norm Step 2-norm cond(J)
---- ------------- ----------- -------
0 4.94241279e+00 1.38455821e-309 Inf
1 1.82069420e+00 1.32719843e-01 3.81961686e+04
26 1.06073162e+00 0.00000000e+00 4.10418461e+04
51 1.06073162e+00 0.00000000e+00 4.10418461e+04
76 1.06073162e+00 0.00000000e+00 4.10418461e+04
101 1.06073162e+00 2.11244819e-15 4.10418461e+04
126 1.06073162e+00 0.00000000e+00 4.10418461e+04
151 1.06073162e+00 1.03030808e-15 4.10418461e+04
Final 1.06073162e+00
----------------------
retcode: Stalled
u: 4-element Vector{Float64}:
1.959101723669487
13.582173936040325
-138.1163224956984
1.5711765683245895
Same answer, seems like no problem