本周的文件交换选择

我们最好的用户提交

多项式拟合通过指定的点

汪东城本周的选择是polyfix通过是Mjaavatten

您是否曾希望对您的数据拟合多项式,并通过某些指定的点进行线路?指定某一点的斜坡怎么样?让我们来看看一些选择,包括是条目。

内容

多项式拟合

这个函数polyfit让您将多项式适合您的数据。我们首先会创建一些数据。

t = linspace(0、2、31)';Y = sin(pi*t)+ 0.1*randn(size(t));情节(t y“o”

我们用一个三阶多项式来拟合数据。

$$ y \约x_1t ^ 3 + x_2t ^ 2 + x_3t + x_4 $$

X_PolyFit = Polyfit(T,Y,3)Y1 = Polyval(X_PolyFit,T);情节(t y“o”,t,y1)传奇(“数据”'polyfit'
X_polyfit = 2.8843 -8.6941 6.0419 -0.2050

约束通过某些点

如果你想让这个多项式经过某些点。也许,您希望曲线穿过(0,0)和(2,0),这就是Are的切入点。但首先,让我谈谈另一种方法。我发现这个问题MATLAB的答案.有几种方法可以处理这个问题,其中之一是使用类似的函数lsqlin优化工具箱lsqlin解决以下最小二乘曲线拟合问题。

$ $ \ min_ {x} \压裂{1}{2}| | C \ cdot x - d | | _2 ^ 2 \四\ rm {\;这}\四\境\{\开始{数组}{1}\ cdot x \ leq b \ \ Aeq \ cdot x =说真的,\ \磅\ leq x \ leq乌兰巴托\{数组}$ $

对于第三阶多项式,$ C $和$ D $定义为以下内容。

$$ c = \ left [t ^ 3 \ quad t ^ 2 \ quad t \四分为1 \ rectle],\ quad d = y $$

$ x $代表多项式术语的系数。

$ $ x: \[开始\{数组}{c} x_1 \ \ x_2 \ \ x_3 \ \ x_4 \结束数组{}\右)$ $

C = [t。^3 t.^2 t ones(size(t))];d = y;

没有不等式的约束,所以我们为$和$ b $设置为空。

a = [];无不等式约束b = [];无不等式约束

对于相等约束,我们需要将$y$的值设置为$t$ = 0,将$t$ = 2设置为0。这意味着

$$ \ begin {array} {rccccc} x_1(0)^ 3 + x_2(0)^ 2 + x_3(0)+ x_4 = 0&\ lightarrow&[0 \ quad0 \ quad0 \ quad1]&\ cdot&x=&0 \\ x_1(2)^ 3 + x_2(2)^ 2 + x_3(2)+ x_4 = 0&\ lightarrow&\ undrbrace {[2 ^ 3 \ quad2 ^ 2 \ quad2 \ quad1]} _ {AEQ}&\ cdot&x =&\ undrbrace {0} _ {beq} \ end {array} $$

将这些放入$ AEQ $和$ BEQ $,我们得到以下内容。

Aeq = [0 0 0 1;% t = 02^3 2^2 2 1];% t = 2beq = [0;当t = 0时,y = 00];当t = 2时,y = 0

然后,我们调用lsqlin求多项式系数。

x_lsqlin1 = lsqlin (C, d, A、b、Aeq beq)
警告:信任区域反射算法只能处理有限约束;使用active-set算法。优化终止。X_LSQLIN1 = 2.5524 -7.6807 5.1518 0
情节(t y“o”、t、C * x_lsqlin1)传说(“数据”'lsqlin') 网格

有一定的导数

让我们为曲线添加更多约束,通过(0.5,1)和(1.5,-1)。此外,我们希望这些点的衍生品为零。这是额外的4个约束。对于这么多的约束,我们将无法满足它们的3阶多项式。让我们尝试第7顺序。

$ $ y \大约x_1t ^ 7 + x_2t ^ 6 + x_3t ^ 5 + x_4t ^ 4 + x_5t ^ 3 + x_6t ^ 2 + x_7t + x_8 $ $

c = [t。^ 7 t。^ 6 t。^ 5 t。^ 4 t。^ 3 t。^ 2 t ^ 2 t(尺寸(t))];

第7阶多项式的衍生物被定义为

$$ \ frac {dy} {dt} \ \约7x_1t ^ 6 + 6x_2t ^ 5 + 5x_3t ^ 4 + 4x_4t ^ 3 + 3x_5t ^ 2 + 2x_6t + x_7 $$

例如,约束"在$t$ = 0.5处的衍生品为零"可以代表

$$ \ begin {array} {c} {7x_1(0.5)^ 6 + 6x_2(0.5)^ 5 + 5x_3(0.5)^ 4 + 4x_4(0.5)^ 3 + 3x_5(0.5)^ 2 + 2x_6(0.5)+ x_7 = 0} \\ \\ {\ downArrow} \\ \\ {\ oderbrace {\ leffrace {\ left [7(0.5)^ 6 \ quad6(0.5)^ 5 \ quad5(0.5)^ 4 \ quad4(0.5)^3 \ quad3(0.5)^ 2 \ quad2(0.5)\ quad1 \ quad0 \右]} _ {aeq} \ cdot x = \ undbractacrace {0} _ {beq}} \ end {array} $$

AEQ = [0 0 0 0 0 0 0 1;% t = 02 ^ 7 2 ^ 6 2 ^ 5 2 ^ 4 2 ^ 3 2 ^ 2 2 1;% t = 20.5^6 0.5^5 0.5^4 0.5^3 0.5^2 0.5 1;%t = 0.51.5 ^ 7 1.5 ^ 6 1.5 ^ 5 1.5 ^ 4 1.5 ^ 3 1.5 ^ 2 1.5 1;%t = 1.57 * 0.5 ^ 6 6 * 0.5 ^ 5 5 * 0.5 ^ 4 4 * 0.5 ^ 3 3 * 0.5 ^ 2 2 * 0.5 1 0;%t = 0.5(对于dy / dt)7 * 6 * 1.5 1.5 ^ 6 ^ 5 5 * 1.5 ^ 4 4 * 1.5 ^ 3 3 * 1.5 ^ 2 2 * 1.5 1 0);%t = 1.5(对于dy / dt)beq = [0;当t = 0时,y = 00;当t = 2时,y = 01 ;%y = 1(当T = 0.5时)1;% y = -1(当t = 1.5时)0;% dy/dt = 0(当t = 0.5)0];%dy / dt = 0(当t = 1.5时)

让我们调整一下,看看我们是否完成了目标。

x_lsqlin2 = lsqlin(C,d,A,b,Aeq,beq)“o”、t、C * x_lsqlin2)传说(“数据”'lsqlin(带衍生约束)') 网格套(GCA,“XTick”0:0.5:2)%调整标记以显示兴趣点
警告:信任区域反射算法只能处理有限约束;使用active-set算法。优化终止。X_lsqlin2 = -0.2925 2.1030 -7.8142 17.6810 -19.6794 5.7234 2.2753 0.0000

polyfix

在matlab答案中帖子我上面提到的,实际上发布了一个响应polyfix.该条目实现了使用具有特定衍生物的特定点来执行多项式拟合的目标。让我们解决同样的问题polyfix,第七阶多项式适合(0,0),(2,0),(0.5,1),(1.5,-1),零点为$ t $ = 0.5和$ t $ = 1.5。

x_polyfix = polyfix (t、y 7[0 2 0.5 - 1.5],[0 0 1 1],[0.5 - 1.5],[0 0])情节(t y“o”,t,polyval(x_polyfix,t))图例(“数据”'polyfix') 网格套(GCA,“XTick”0:0.5:2)%调整标记以显示兴趣点
X_POLYFIX =列1到7 -0.2925 2.1030 -7.8142 17.6810 -19.6794 5.7234 2.2753第8列0

如果我们把这个结果和lsqlin,我们看到它基本上是相同的。

规范(x_lsqlin2-x_polyfix”)
ans = 2.1194平台以及

优化工具箱

是的polyfit是很好的执行多项式拟合的约束通过点。如果您需要其他复杂的约束,您可能希望签出优化工具箱

评论

试一试,让我们知道你的想法这里或离开A.评论因为是。




发布与MATLAB®R2015b

|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击这里要登录您的MathWorks帐户或创建新的。