# Define residual functions def residualFunction(params): modelx = ot.ParametricFunction(model, [0, 1, 2], params) return [modelx(x[i])[0] - y[i, 0] for i in range(m)] def residualFunctionNoise(params): modelx = ot.ParametricFunction(model, [0, 1, 2], params) return [modelx(x[i])[0] - ynoise[i, 0] for i in range(m)] # Definition of residual as ot.PythonFunction and optimization problem residual = ot.PythonFunction(n, m, residualFunction) residualNoise = ot.PythonFunction(n, m, residualFunctionNoise) lsqProblem = ot.LeastSquaresProblem(residual) lsqNoiseProblem = ot.LeastSquaresProblem(residualNoise) startingPoint = [0.0, 0.0, 0.0] ### LSQ SOLVER # Definition of Dlib solver, setting starting point lsqAlgo = ot.Dlib(lsqProblem, "LSQ") lsqAlgo.setStartingPoint(startingPoint) lsqAlgo.run() # Retrieving results lsqResult = lsqAlgo.getResult() printResults(lsqResult, "LSQ (without noise)") # Same with noise
modelx = ot.ParametricFunction(model, [0, 1, 2], p) return [modelx(x[i])[0] - y[i, 0] for i in range(m)] residualFunction = ot.PythonFunction(n, m, residualFunction_py) bounds = ot.Interval([0, 0, 0], [2.5, 8.0, 19]) for algoName in algoNames: line_search = not (algoName in ['LEVENBERG_MARQUARDT', 'DOGLEG']) for bound in [True, False]: if bound and line_search: # line search do not support bound constraints continue print('algoName=', algoName, 'bound=', bound) problem = ot.LeastSquaresProblem(residualFunction) if bound: problem.setBounds(bounds) startingPoint = [1.0] * n algo = ot.Ceres(problem, algoName) algo.setStartingPoint(startingPoint) # algo.setProgressCallback(progress) # algo.setStopCallback(stop) algo.run() result = algo.getResult() x_star = result.getOptimalPoint() print(result) if bound: assert x_star in bounds, "optimal point not in bounds" else: if not line_search:
p_ref = [2.8, 1.2, 0.5] # Reference a, b, c modelx = ot.ParametricFunction(model, [0, 1, 2], p_ref) # Generate reference sample (with normal noise) y = np.multiply(modelx(x), np.random.normal(1.0, 0.05, m)) def residualFunction(params): modelx = ot.ParametricFunction(model, [0, 1, 2], params) return [modelx(x[i])[0] - y[i, 0] for i in range(m)] # %% # Definition of residual as ot.PythonFunction and optimization problem residual = ot.PythonFunction(n, m, residualFunction) lsqProblem = ot.LeastSquaresProblem(residual) # %% # Definition of Dlib solver, setting starting point lsqAlgo = ot.Dlib(lsqProblem, "least_squares") lsqAlgo.setStartingPoint([0.0, 0.0, 0.0]) lsqAlgo.run() # %% # Retrieve results result = lsqAlgo.getResult() print('x^ = ', result.getOptimalPoint()) print("f(x^) = ", result.getOptimalValue()) print("Iteration number: ", result.getIterationNumber()) print("Evaluation number: ", result.getEvaluationNumber())