【问题标题】:Optimization based line fitting基于优化的线拟合
【发布时间】:2021-07-20 06:31:20
【问题描述】:

我正在使用以下优化脚本,通过它我在两点 y_1(t_1=0)=1 和 y_2(t_2=10) 之间拟合以下曲线 y(t)=c_1+c_2 e^{-t} =7

我的问题是,如何通过添加约束 y(t=5)>4 来解决相同的优化问题?

clc;
clear;

tic

%The Data: Time and response data
t = [0 10]';
y = [1 7]';
%Look at the Data
subplot(2,1,1)
plot(t,y,'*','MarkerSize',10)
grid on
xlabel('Time')
ylabel('Response')
hold on
%Curve to Fit
E = [ones(size(t)) exp(-t)]
%Solving constrained linear least squares problem
% cNew = lsqlin(E,y,[],[],[1 1],y(1),[],[],[],opt) % Solver-based approach
p = optimproblem;
c = optimvar('c',2);
p.ObjectiveSense = 'minimize';
p.Objective = sum((E*c-y).^2);
% constraint example: p.Constraints.intercept = c(1) + c(2) == 0.82
sol = solve(p);
cNew = sol.c;
tf = (0:0.1:10)';
Ef = [ones(size(tf)) exp(-tf)];
yhatc = Ef*cNew;
%plot the curve\
subplot(2,1,2)
plot(t,y,'*','MarkerSize',10)
grid on
xlabel('Time')
ylabel('Response')
hold on
plot(tf,yhatc)
title('y(t)=c_1 + c_2e^{-t}')

toc

【问题讨论】:

  • 这令人困惑。您提供两 (2) 个数据点和两 (2) 个参数中的参数曲线。这是一个直接拟合问题,而不是 OLS 回归。您的意思是这两个点限定了感兴趣的范围(并且可能您的数据介于两者之间)?
  • 如何修改目标函数如下。 p.Objective = sum((E*c-y).^2)+ 1e2*(sum(c)-0.82).^2; 。阅读有关约束优化的拉格朗日乘数。
  • @J.A.Ferrand 抱歉,我刚刚修改的问题中遗漏了一部分。我的目标是在 T0 和 Tf 的两点之间拟合(优化)一条曲线,以便在 T0 和 Tf 之间,组合某些约束(例如 T0=0,Tf=10 并且约束在 T=4 y(t)~=3)
  • @Praveen 你能看看我刚刚在上面添加的评论吗

标签: matlab optimization mathematical-optimization convex


【解决方案1】:

从 MATLAB 的 documentation,您可以使用添加约束

p.Constraints.cons1 = c(1) + c(2) * exp(-5) >= 4;

另外,请注意,由于数字原因,优化器不支持严格的不等式 >。因此,如果您仍然想要严格的不等式,请添加一个容差,例如

tol = 1e-10;
p.Constraints.cons1 = c(1) + c(2) * exp(-5) >= 4 + tol;

然后像在代码中那样解决优化问题。

【讨论】:

  • 感谢您的支持。有用!我有一个问题,也和这个问题有关。好心,我想问你是否可以帮忙!让我们假设在解决了我提供的优化问题,从而组成了一条 y_i(t) 曲线后,我想针对空间中的不同两个点(另外两个要添加的点和一个新的 j要拟合的曲线)。在这第二次中,如何通过构成 yj[t]~=yi[t] 的约束来解决 opt 问题。意思是,在每个时间步 t,第一条曲线的 y 和第二条曲线的 y 之间没有冲突@Amro
  • 如果您需要更多说明,请告诉我
  • 拟合函数y_i(t_i)t_i范围内有效。因此,如果您在 t_i(例如 [0, 4])范围内有 t_j(例如 [1, 2]),那么 y_j[t_i] = y_j[t_j] 无需任何计算。但是,如果t_j 超出t_i 的范围,则可以通过为t_j 中的每个t_k 添加等式约束y_i(t_k)=y_j(t_k) 来解决优化问题。 t_kt_j 的离散化。不过,这个优化问题可能很难用数值解决。
  • 感谢您的回复,让我再澄清一下约束。正如您提到的,我们假设 y_i(t_i) 在 t_i 范围内有效(例如,[0, 10]),也类似于上面的代码,起点 y_i(0)=1,目标点 y_i(10)=7 .现在,我想组成在同一时间范围 t_j=t_i 上有效的其他曲线 y_j(t_i)。这个想法是我希望 y_j(t_i) 曲线从点 y_j(0)= 2 开始并在 y_j(5)=5 结束,两条曲线之间的任何时间步长的位置都没有冲突(对于所有 t yj[t] 不等于 yi[t]) @Amro
  • 我还要添加三个可以简化问题的提示: 1- 我可以使用不同的目标函数(可以采用另一个函数而不是 y(t)=c(1) + c(2) * exp(-t))。 2-将问题转为 2D 或 3D 以避免在某个时间步长两条曲线之间的冲突也是可以的。 3-速度不固定,换句话说,第二条曲线可以从y_j(0)= 2开始到y_j(15)=5结束,受益于y负值@Amro
猜你喜欢
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2017-12-18
  • 2022-12-11
  • 2018-07-27
  • 2018-04-19
  • 2021-02-16
  • 2013-06-12
相关资源
最近更新 更多