我是Matlab的新手,我正在寻找关于初始化函数(= vs = @或其他选项)的合适或最佳方法的建议,以便能够区分它,找到一个值一个特定的参数并绘制它以及特定点的切线。
我发现的事情:
f = my function(x) % but needs x initalized; returns values
diff(f, x)
plot(x, f)
f = @(x) my function
diff(f, x) % doesn't work
fplot(f, x)
象征性地
syms x
f = my function
但在最近的两个案例中,我无法获得价值,区分或绘制f。
答案 0 :(得分:1)
根据您的具体情况,您希望提供一个函数并找到它的分析导数。一旦找到这个,你想确定此时的导数是什么,然后绘制与原始函数重合的切线。
最好的方法是使用syms
来定义符号变量,然后与diff
区别开来。现在,剩下的就是我们想用它来代替实际价值。您可以使用精心设计的matlabFunction
函数为您完成此操作。这将采用符号数学定义的等式并返回可接受数字输入的函数句柄。我想补充一点,从这个句柄返回的所有运算符都是元素。
获得分析导数后,通过将该点替换为matlabFunction
中新创建的函数,您可以非常轻松地找到切线的斜率,然后您必须再次使用matlabFunction
将原始函数转换为函数句柄,以便在此切线上找到一个点。然后,您将获得点和斜率,您可以通过以下方式轻松找到切线方程:
y -y0 = m*(x - x0)
x0
是您想要的点,y0
是原始函数的输出,m
是使用导数找到的斜率。
我将为实现您的目标而执行的步骤如下:
x
,t
,无论diff
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');
让我们慢慢地完成每一步。
非常直截了当。我正在使用t
作为感兴趣的变量。
我使用前面定义的符号变量定义了一个y = t^3
的函数。再次,非常容易。
我们计算步骤#2中定义的函数y
的分析导数与t
.... easy。
我们为原始函数和派生函数创建数值函数句柄,以便我们可以替换点...它们是否存储在数组或矩阵中...以便我们可以评估此数组中每个值的含义尊重他们所代表的职能。
基本上,您需要使用matlabFunction
,以便您可以使用这些来替换您想要的任何数字。
我定义了-4 <= x <= 4
的域名,但这取决于您正在绘制的功能。你必须根据适当的域名改变它。我还选择了步长为0.01
,因为当你在MATLAB中绘制东西时,你会绘制一个点数组。这允许我以0.01的步长生成从-4到4的值列表。
我生成一个新的数字,使用hold on
,这样当我们多次调用plot
时,它会附加到新数字上。然后我们继续绘制原始曲线。请注意我正在使用MATLAB创建的函数句柄来存储yh
中的原始曲线。
我选择了我想要的兴趣点,即x0 = 2
,然后我确定此时的输出值是什么......存储在y0
中。
一旦我计算出所需的点,我用导数函数计算此点所见的斜率,然后我重新排列切线的方程,以便在给定我们创建的原始域的情况下产生输出值,以及{先前已创建{1}}。这个输出将是切线点的输出。请注意,我将关注点放在感兴趣点(x0,y0)
所在的位置周围,并定义一个名为(x0,y0)
的变量,该变量将绘制以{{1}为中心的行tol
}。具体来说,它将绘制+/- tol
和(x0,y0)
之间的线。我在这里设置x0 - tol
,但是根据适合你的方式进行更改。
用红色绘制感兴趣的点,用绿色绘制切线的等式。请记住,切线的点数与原始域的点数不匹配,因此请确保使用正确的数组作为正确的点。
这是我得到的: