鉴于您的特定情况,您希望提供一个函数并找到它的解析导数。一旦你找到这个,你希望确定这个点的导数是多少,然后绘制与原始函数重合的切线。
最好的方法是肯定使用syms
定义一个符号变量,然后diff
像你一样区分。现在,剩下的就是我们想用它来替换实际值。您可以使用精心设计的matlabFunction
功能为您做到这一点。这将接受一个符号数学定义的方程并返回一个可以接受数字输入的函数句柄。我想补充一点,从此句柄返回的所有运算符都是element-wise。
一旦你有了解析导数,你可以很容易地通过将点替换到新创建的函数中来找到切线的斜率,matlabFunction
然后你必须matlabFunction
再次使用将原始函数转换为函数句柄,这样你就可以在这条切线上找一点。然后你会有点和斜率,你可以通过以下方式轻松找到切线的方程:
y -y0 = m*(x - x0)
x0
是您想要的点,y0
是使用原始函数看到的输出,m
是使用导数找到的斜率。
我将执行的步骤来实现您想要的内容如下:
- 定义一个符号变量
x
, t
, 不管
- 定义原函数
- 通过计算导数
diff
- 通过将 2 和 3 都转换为函数句柄
matlabFunction
- 定义一个代表功能的好域
- 绘制原始函数
- 选择一个你想找到斜率的点
- 计算切线方程并确定该线的适当域
- 绘制这条线并强调兴趣点
这是每个步骤的代码的样子......让我们使用y = x^3
并分析斜率x = 2
作为示例:
%// Step #1
syms t;
%// Step #2
y = t^3;
%// Step #3
dy = diff(y, t);
%// Step #4
yh = matlabFunction(y);
dyh = matlabFunction(dy);
%// Step #5
x = -4:0.01:4;
%// Step #6
figure;
hold on;
plot(x, yh(x));
%// Step #7
x0 = 2;
slope = dyh(x0);
%// Step #8
%// y - y0 = m*(x-x0)
%// y = m*(x - x0) + y0
tol = 1;
x2 = x0-tol:0.01:x0+tol;
y0 = yh(x0);
out = slope*(x2 - x0) + y0;
%// Step #9
plot(x0, y0, 'r.');
plot(x2, out, 'g');
让我们慢慢完成每一步。
第1步
非常直截了当。我在t
这里用作感兴趣的变量。
第2步
我定义了一个y = t^3
使用之前定义的符号变量的函数。再次,非常容易。
步骤#3
我们计算y
步骤 #2 中定义的函数关于t
....easy 的解析导数。
第4步
我们为原始函数和导数创建数值函数句柄,以便我们可以替换点......无论它们是存储在数组还是矩阵中......这样我们就可以评估这个数组中的每个值相对于它们代表的功能。
基本上,您需要matlabFunction
使用这些来替换您想要的任何数字。
步骤#5
我定义了域,-4 <= x <= 4
但这取决于您正在绘制的函数。您必须根据正确的域进行更改。我还选择了步长,0.01
因为当您在 MATLAB 中绘制事物时,您会绘制一个点数组。这允许我以 0.01 的步长生成从 -4 到 4 的值列表。
步骤#6
我生成了一个新图形,hold on
这样当我们plot
多次调用时,它会附加到新图形上。然后我们继续绘制原始曲线。请注意,我正在使用 MATLAB 为存储在yh
.
步骤 #7
我选择我想要的兴趣点,即x0 = 2
,然后我确定此时的输出值是什么......存储在y0
.
步骤 #8
一旦我计算出所需的点,我用导数函数计算在这一点上看到的斜率,然后我重新排列切线方程以在给定我们创建的原始域以及(x0,y0)
之前创建的域的情况下产生输出值。其输出将是切线点的输出。请注意,我将线居中放在兴趣点周围,(x0,y0)
并且我定义了一个名为的变量,该变量tol
将绘制以 为中心的+/- tol
线(x0,y0)
。具体来说,它将绘制 和 之间的x0 - tol
线x0 + tol
。我设置tol = 1
在这里,但是根据适合你的来改变它。
步骤 #9
用红色绘制兴趣点,用绿色绘制切线方程。请记住,切线的点数与原始域的点数不匹配,因此请确保为正确的点使用正确的数组。
这是我得到的: