kapple
#1
FYI for the other definitions of model (commented out), I’ve tested them with the same pair of parameters.

```
using Plots
using LsqFit
# Define expected curve behaviour
# @. model(t, p) = p[2]*exp(p[1]*t) # works
# @. model(t, p) = exp(p[1]*t)*sin(p[2]*t) # works
@. model(t, p) = p[1]*t*sin(p[2]*t) # doesn't work
# Mock data
t = 0:0.1:10
p₀ = [-1.2, 3.5]
data = model(t, p₀)
# Find parameters
lb = [-2., 2.5]
ub = [-0.1, 4.]
p0_bounds = [-1., 3.]
fit = curve_fit(model, t, data, p0)
# Plot result
scatter(t, data)
plot!(t, model(t, coef(fit)))
@show stderror(fit)
```

MatFi
#2
well seems to be related to this thread. Note that Levenberg Marquardt is not the robustest Method for such kind of problems (multiple local minima).

Optim.jl provides a simple SA-Optimizer which tend to be more robust for this task

```
using Optim
loss(u) = sum((data .- model(t,u)).^2)
res = optimize(loss, p0_bounds, SimulatedAnnealing())
# Plot result
scatter(t, data)
plot!(t, model(t, Optim.minimizer(res)))
```

Or you can try the awesome BlackBoxoptim.jl

EDIT: To elaborate a bit on this:

By simply plotting the value of `loss(u)`

around the `p₀`

you can visualize how challenging your problem actually is:

you can see multiple local minima next to the global one

3 Likes

kapple
#3
Thanks! I gave it a shot and it worked! I’ll know how to investigate tractability in future.

Thank you for teaching me the name of such a method, didn’t know it had one.

Oh wow, that’s really insightful.