带斜率的 MATLAB 曲线拟合

MATLAB Curve Fitting with Slopes

背景

我目前正在为我的 MATLAB 工程课程做讲座,偶然发现了一个我想向 class 提出的问题。我做了很多不同的尝试来解决这个问题,但我的图表总是不正确。我将在下面描述这个问题以及我为解决这个问题所采取的所有步骤。

问题

求四次多项式的系数

P(x) = ax^4 + bx^3 + cx^2 + dx + e

其图形通过点 (0, 1)(1, 1)(-1,3)x = -1 处的斜率为 20x = 1 处的斜率为 9.

目视检查您的答案。

尝试

我首先创建了一个由上述 x 值组成的矩阵,我按如下方式得出:

A = [0^4 0^3 0^2 0 1; 1^4 1^3 1^2 1 1; (-1)^4 (-1)^3 (-1)^2 -1 1];
A = [0 0 0 0 1; 1 1 1 1 1; 1 -1 1 -1 1];

这将创建一个 5 列乘 3 行的矩阵,我可以用它来绘制多项式。

我的问题是我无法获得最后一行的 x 值,因为每一行都是方程组中的一个方程,并且必须有与未知数一样多的方程( 4:a、b、c、d 未知,但如您所见,e 始终等于 1)。

暂时忽略这个问题,我可以继续创建一个 y 值的垂直矩阵,以便我可以求解方程组。这些 y 值已经给出,所以我所要做的就是输入以下代码:

y = [1 1 3]';

再一次,方程组应该有第四个 y 值,但我无法仅使用 x = -1 和 [=21 处的点的斜率推导出它=].

导出 x 值和 y 值后,我们可以继续使用 backslash operator (/) 求解线性方程组 A*x = y。

p = A\y;

mldivide 是关于 mldivide 函数的更多信息,供任何需要参考的人参考。

从现在开始,下面的代码从这个方程组创建多项式并绘制它,应该保持不变。

u = -1:.01:1;
v = polyval(p, u);
plot(u,v);

在此代码中,u 是从 -11 的 x 值域,间隔为 0.01。这是我们使用 polyval 函数所必需的,该函数根据我们在 p 处在 u.

区间导出的方程组创建多项式

最后,plot 使用 MATLAB 的 GUI 在区间 u.

上简单地绘制我们导出的多项式

如您所见,我唯一缺少的部分是矩阵 A 中的多一行 x 值和矩阵 y 中的一个 y 值,我需要找到四个未知数 a、b、c 和 d。我相信您必须使用问题中给出的两个斜率来找到每个点。我尝试使用 polyder 函数通过 p 获得矩阵的导数,

q = polyder(p);

但我仍然对如何从那里继续感到困惑。任何帮助将不胜感激。

我会计算多项式的导数:

dP(x) = 4ax^3 + 3bx^2 + 2cx + d

现在,你知道 dP(-1)=20dP(1)=9 所以你有 5 个方程和 5 个未知数:

e = 1
a + b + c + d + e = 1
a - b + c - d + e = 3
-4*a + 3*b - 2*c + d = 20
4*a + 3*b + 2*c + d = 9

因此您可以构建一个 5x5 矩阵并求解系统,就像您对 A\y 所做的那样。

构造这个 5x5 矩阵的代码是:

A = [0 0 0 0 1 ; 1 1 1 1 1 ; 1 -1 1 -1 1 ; -4 3 -2 1 0 ; 4 3 2 1 0];
y = [1 1 3 20 9]';

然后您可以在绘图上查看结果:

p=A\y;
u = -1:.01:1;
v = polyval(p, u);
data_pts = [0, 1; 1, 1;-1, 3]
plot(u,v,data_pts(:,1),data_pts(:,2),'rx')

给出了以下情节:

您可以对导数执行相同的操作并检查它是否经过点 (-1,20)(1,9)