带斜率的 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
处的斜率为 20
,x = 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
是从 -1
到 1
的 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)=20
和 dP(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)
。
背景
我目前正在为我的 MATLAB 工程课程做讲座,偶然发现了一个我想向 class 提出的问题。我做了很多不同的尝试来解决这个问题,但我的图表总是不正确。我将在下面描述这个问题以及我为解决这个问题所采取的所有步骤。
问题
求四次多项式的系数
P(x) = ax^4 + bx^3 + cx^2 + dx + e
其图形通过点 (0, 1)
、(1, 1)
、(-1,3)
和
x = -1
处的斜率为 20
,x = 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
是从 -1
到 1
的 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)=20
和 dP(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)
。