本周文件交换选择

我们最好的用户反馈

多项式拟合通过指定点

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

你有没有想过用多项式来拟合你的数据,让直线经过一些指定的点?那么指定某一点的斜率呢?让我们来看看一些选项,包括Are的条目。

内容

多项式拟合

这个函数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 {\;那}\quad \Bigg \{\begin{array}{l} A \cdot x \leq b, \\ Aeq \cdot x = beq, \\ lb \leq x \leq ub \end{array} $$

对于三阶多项式,$C$和$d$定义如下。

$$C = \left[t^3 \quad t^2 \quad t \quad 1 \right],\quad d = y$$

$x$表示多项式项的系数。

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

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

没有不平等约束,所以我们将$A$和$b$设置为空。

A = [];%无不等式约束B = [];%无不等式约束

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

数组$ $ \开始{}{rccccc} x_1 (0) ^ 3 + x_2 (0) ^ 2 + x_3 (0) + x_4 = 0 & \ Rightarrow & [0 \ quad0 \ quad0 \ quad1] x = & 0 & \ cdot & \ \ x_1 (2) ^ 3 + x_2 (2) ^ 2 + x_3 (2) + x_4 = 0 & \ Rightarrow & \ underbrace {[2 ^ 3 \ quad2 ^ 2 \ quad2 \ quad1]} _ {Aeq} & \ cdot & x = & \ underbrace {0} _ {beq} \{数组}$ $

将这些放入$Aeq$和$beq$中,得到如下结果。

Aeq = [0 0 0 1;% t = 02^3 2^2 2 1];% t = 2Beq = [0;% y = 0(当t = 0)0);% y = 0(当t = 2)

然后我们调用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个约束条件。有这么多约束条件,我们不能用三阶多项式来满足它们。我们试试七阶。

$ $ 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 ones(size(t))];

七阶多项式的导数定义为

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

例如,约束" $t$ = 0.5处的导数为零"可以表示为

$ $ \{数组}{c}{7日开始x_1 (0.5) ^ 6 + 6 x_2 (0.5) ^ 5 + 5 x_3 (0.5) ^ 4 + 4 x_4 (0.5) ^ 3 + 3 x_5 (0.5) ^ 2 + 2 x_6 (0.5) + x_7 = 0 } \\ \\ { \ Downarrow } \\ \\ { \ 左underbrace {\ [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 = \ underbrace {0} _ {beq}} \{数组}$ $

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^7 0.5^6 0.5^5 0.5^4 0.5^3 0.5^2 0.5 1;% t = 0.51.5^6 1.5^5 1.5^4 1.5^3 1.5^2 1.5 1;% t = 1.57 * 6 * 0.5 0.5 ^ 6 ^ 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;% y = 0(当t = 0)0;% y = 0(当t = 2)1 ;% 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) plot(t,y,“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.1194e-10

优化工具箱

是的polyfit对于通过点周围的约束进行多项式拟合非常好。如果您需要其他复杂的约束条件,您可能需要查看优化工具箱

评论

试一试,让我们知道你的想法在这里或者留下评论为是。




发布与MATLAB®R2015b

|
  • 打印
  • 发送电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。