从给定函数生成周期函数

generate periodic function from given function

假设从给定的函数f(t),我们想构造新的函数,它是通过这种方式从现有函数给出的

其中 T 是某个常数假设 T=3;当然现实中k不可能从-infinity到infinity因为我们不能用电脑做无穷大求和所以首先是我负担得起的

首先让我们定义我们的函数

function y=f(t);
y=-1/(t^2);
end

和第二个节目

k=-1000:1:999;
F=zeros(1,length(k));
T=3;
for t=1:length(k)
F(t)=sum(f(t+k*T));
end

但是当我运行第二个程序时,我得到

>> program
Error using  ^ 
Inputs must be a scalar and a square matrix.
To compute elementwise POWER, use POWER (.^) instead.

Error in f (line 2)
y=-1/(t^2);

Error in program (line 5)
F(t)=sum(f(t+k*T));

所以我有两个与此程序相关的问题:

1.first 是什么错误为什么显示我错误

  1. 如何在 excel 中完成?我能以某种方式简化它吗?提前致谢

已编辑:

我已经通过这种方式更改了我的代码

k=-1000:1:999;
F=zeros(1,length(k));
T=3;
for t=1:length(k)
    result=0;
    for l=1:length(k)
        result=result+f(t+k(l)*T);
    end
    F(t)=result;
end

可以吗?

要以向量化的方式解决您的问题,您必须更改函数 f 以便可以使用向量作为输入来调用它。正如@patrik 所建议的,这是通过使用元素运算符 .* ./ .^ (Afaik,不存在 .+ .- 来实现的。不幸的是,@rayryeng 的评论并不完全正确,这可能会导致混淆。正确的方法是对除法 ./ 正方形 .^:

使用元素运算符
function y = f(t)
    y = -1 ./ (t.^2);
end

您现有的代码(第一个版本)

k = -1000:1:999;
F = zeros(1,length(k));
T = 3;
for t=1:length(k)
    F(t) = sum(f(t+k*T));
end

然后按预期工作(并且比您在编辑中发布的版本快得多)。

您甚至可以消除 for 循环并使用 arrayfun instead. For simple functions f, you can also use function handles 而不是创建单独的文件。这给出

f = @(t) -1 ./ (t.^2);
k = -1000:1:999;
t = 1:2000;
T = 3;
F = arrayfun(@(x)sum(f(x+k*T)), t);

而且速度更快,而且是一种简单的单行代码。 arrayfun 将任何函数句柄作为第一个输入。我们创建一个函数句柄,它接受一个参数 x 并对所有 k: @(x) sum(f(x+k*T) 求和。第二个参数,向量 t,包含计算函数句柄的所有值。

正如@Divakar 在评论中提出的,您还可以使用bsxfun 函数:

f = @(t) -1 ./ (t.^2);
k = -1000:1:999;
t = 1:2000;
T = 3;
F = sum(f(bsxfun(@plus,k*T,t.')),2);

其中 bsxfun 创建一个矩阵,其中包含 tk*T 之间的所有组合,它们都使用 f(...) 和最后的 sum 进行评估第二个维度对所有 k 求和。


基准测试

让我们比较这些解决方案:

  1. for循环和sum的组合(原题):

    Elapsed time is 0.043969 seconds.

  2. 在 2 for 循环中遍历所有组合(已编辑的问题):

    Elapsed time is 1.367181 seconds.

  3. 矢量化方法 arrayfun:

    Elapsed time is 0.063748 seconds.

  4. @Divakar 提出的 bsxfun 向量化方法:

    Elapsed time is 0.099399 seconds.

所以(遗憾的是)包含 for 循环的第一个解决方案击败了两种矢量化方法。对于较大的 k 向量 (-10000:1:9999),可以重现此行为。结论似乎是MATLAB确实学会了如何优化for循环