我有2个功能:
[ccexpan
-在第一种基础的Chebyshew多项式中计算函数f
与N
个节点的插值多项式的系数。
[csum
-使用t
中的系数c
计算参数ccexpan
的值(使用Clenshaw算法)。
这是我到目前为止所写的:
function c = ccexpan(f,N)
z = zeros (1,N+1);
s = zeros (1,N+1);
for i = 1:(N+1)
z(i) = pi*(i-1)/N;
end
t = f(cos(z));
for k = 1:(N+1)
s(k) = sum(t.*cos(z.*(k-1)));
s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2;
end
c = s.*2/N;
和:
function y = csum(t,c)
M = length(t);
N = length(c);
b = zeros(M,N+2);
is_vert = size(t);
is_vert = is_vert(2)>1;
if is_vert
t=t.';
end
for i = N:-1:1
b(:,i) = c(i)+2.*t.*b(:,i+1)-b(:,i+2);
end
y=(b(:,1)-b(:,3))./2;
if is_vert
y=y.';
end
[[在csum
中,y
需要具有与t
相同的尺寸,这就是为什么我需要is_vert
)
不幸的是,这些程序非常慢,并且还有些不足。 [请给我一些有关如何加快速度以及如何提高准确性的提示。
尽可能尝试摆脱循环结构。乍一看,我会用你的第一个for循环
for i = 1:(N+1)
z(i) = pi*(i-1)/N;
end
并替换为
i=1:(N+1)
z = pi*(i-1)/N
我没有检查其余的代码,但是上面的示例肯定会加快您的代码速度。第二种策略是在可能的情况下组合循环。
Martin,用于ccexpan中的第二个for循环
for k = 1:(N+1)
s(k) = sum(t.*cos(z.*(k-1)));
s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2;
end
我相信您想要做的是将k设置为列向量
k = (1:(N+1))'
然后利用MATLAB的隐式展开,将第一个方程分为两个部分。在下面,s1应该是一个矩阵,其中k的每一行都有一行,而z和t的每一行都有一列。 s2将是每一行的总和,即每k的值。
s1 = t.*cos(z.*(k-1))
s2 = sum(s1,2)
根据我的以上评论,我对您的示例函数有些困惑。所以现在,我将不得不转换您的第二个s(k)方程。祝你好运