MATLAB:为什么anoynomous函数缺少`(t,y)`这里?

时间:2016-09-26 03:42:15

标签: matlab

function yprime=example1(t , y)
yprime=cos(t)./(2*y-2);

Then type
>> [t,y] =ode45(@example1, [0, 4*pi],3);
>> plot(t , y)

ode45(@example...)行。为什么不是ode(@45(t,y)example...)?如果输入丢失,如何将[0, 4*pi]3传递给派生词(例如example1)?

2 个答案:

答案 0 :(得分:2)

@运算符可以创建两个(可能更多)不同的types of handles:简单和匿名。一个简单的函数句柄是直接引用函数文件并且没有其他指向级别的函数句柄。匿名函数是一个句柄,它本身就是一个(非常简单的)函数,并拥有自己的工作空间,用于持续存储,闭包和其他目的。使用functions函数可以看出差异:

>> f1 = @example1
f1 = 
    @example1

>> f2 = @(t,x) example1(t,x)
f2 = 
    @(t,x)example1(t,x)

>> functions(f1)
ans = 
    function: 'example1'
        type: 'simple'
        file: 'C:\Development\example1.m'

>> functions(f2)
ans = 
            function: '@(t,x)example1(t,x)'
                type: 'anonymous'
                file: ''
           workspace: {[1x1 struct]}
    within_file_path: '__base_function'

匿名函数增加了一些开销,因为它们不仅仅是指向函数的指针,因此只有在您parameterizing functions时才真正需要。

无论创建如何,ode45及其亲属将始终尝试将ty参数对传递给您通过feval传递的句柄,并且只有在使用匿名函数与直接文件句柄引用时才需要参数列表。

答案 1 :(得分:0)

这就是MATLAB中ode45函数的工作原理。 ode45(@ function,[start,end]表示t,y的初始值。)

所以在上面的例子中,函数是example1,t0将是0,tn(最后一个点)将是4 * pi,y的初始值是3.

使用ode45最重要的部分是正确设置功能。注意如何为dy / dt设置该功能。因此,给定一个初始点,它可以在时间t生成y的其余点,因为它可以计算y随t增加的变化。