如何限制通过特定的点拟合曲线像MATLAB的起源吗?

326(30天)
我想使用POLYFIT函数或曲线拟合工具箱对拟合曲线的线性约束,迫使他们通过特定点像原点。

接受的答案

MathWorks支万博1manbetx持团队
约束拟合曲线,通过特定的点需要使用一个线性约束。POLYFIT函数和曲线拟合工具箱允许指定线性约束。执行此操作需要使用LSQLIN函数的优化工具箱。
考虑到数据由以下命令:
c = [1 2 1 1];
x = linspace (2、4);
y = c (1) * x。^ 3 + c (2) * x。^ 2 + c (3) * x + c (4) + randn (1100);
情节(x, y,“。b - - - - - -”)
您可以查看不适合一个三阶多项式(使用POLYFIT)通过:
持有
c = polyfit (x, y, 3);
yhat = c (1) * x。^ 3 + c (2) * x。^ 2 + c (3) * x + c (4);
情节(x, yhat,“r”,“线宽”,2)
然而,如果你希望限制适合通过一个特定的点,例如(x0, y0):
x0 = 1;
y0 = 10;
使用LSQLIN函数的优化工具箱解决一个线性约束的线性最小二乘问题,像下面的例子:
x = x (:);%重塑数据转换成一个列向量
y = y (:);
% ' C '是“x”的范德蒙矩阵
n = 3;%多项式适合度
V (:, n + 1) = 1(长度(x), 1类(x));
j = n: 1:1
V (:, j) = x。* V (:, j + 1);
结束
C = V;
% ' d '是目标值的向量,“y”。
d = y;
%没有不等式约束在这种情况下,也就是说,
一个= [];
b = [];
%我们使用线性等式约束,迫使曲线达到所需的点。在
%这种情况下,‘Aeq’是‘x0 Vandermoonde矩阵
Aeq = x0。^ (n: 1:0);
%,“说真的”是价值曲线应该在这一点上
说真的= y0;
p = lsqlin (C, d, A、b、Aeq beq)
%,我们可以使用POLYVAL评价拟合曲线
yhat = polyval (p (x);
%画出原始数据
情节(x, y,“。b - - - - - -”)
持有
%的情节点
情节(x0, y0,“gx”,“线宽”4)
%图拟合数据
情节(x, yhat,“r”,“线宽”,2)
持有
2的评论
K E
K E 2015年3月27日
编辑:K E 2015年3月27日
非常感谢。为我节省了大量的时间。注意,在R2015a,返回一个错误:
警告:trust-region-reflective算法只能处理绑定约束;
使用有效集算法。
在lsqlin >(第304行)
建议的解决方案是什么?或者也许是没有必要的;函数仍然返回答案(p)。

登录置评。

更多的答案(2)

是Mjaavatten
是Mjaavatten 2015年11月28日
编辑:MathWorks支万博1manbetx持团队 2023年5月15日
这个函数 polyfix 我刚才提交的可能是你寻找的东西。
2的评论

登录置评。


约翰D 'Errico
约翰D 'Errico 2015年3月27日
实际上,可以解决这个问题非常非常的方式不需要lsqlin,或任何的意。真的是没有要求一个线性约束,自约束将常数参数多项式模型只是零。所以使用反斜杠来估计模型系数,把常数项。注意,这只能通过原点力一点,自点(x, y) =(0, 0)在一个多项式模型意味着常数项必须等于零。
所以,给定的模型形式
y = a1 * x ^ 3 + * x ^ 2 + a3 * x
我们可以把它简单
a123 = [x。^ 3 x。y ^ 2 x] \;
在x和y是列向量的数据。
您甚至可以使用polyval评价多项式,只需添加一个零的向量f系数,因此
P = [a123; 0];
如果你想强迫模式通过点(x0, y0),这些值不是原点的地方,然后我们需要稍微工作,但不是很多。与lsqlin虽然可以这样做,如果你没有这个工具(或我自己的伦敦,发现在文件交换)只做这个简单的转换:
xtr = x - x0;
a123 = [xtr。^ 3,额外的。^ 2,xtr] \ (y - y0);
从本质上讲,我们现在已经适应模型
* (x - y - y0 = a1 x0) ^ 3 + a * (x - x0) ^ 2 + a3 * (x - x0)
你可以看到,当x = = x0, y必须预测y0。
评估这个模型非常简单。你仍然可以使用polyval,记住先减去x0从x。
P = [a123; y0];
ypred = polyval (P, xpred - x0);
当我们有一个更复杂的问题,也许你需要强迫两个点在曲线上?那么,你可以使用lsqlin或自己的伦敦。(注意,伦敦证交所在R2015a没有警告消息。)
或者,如果你有一个三角模型?如果模型具有非线性参数,那么您将需要使用非线性优化。并根据模型,迫使其通过一个给定的点,这可能需要一个非线性工具,它可以处理一个等式约束,所以可能fmincon。但有时,根据模型中,可能有更简单的解决方案。万博 尤文图斯这一切都取决于模型。

s manbetx 845


释放

R14SP1

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!