在MATLAB中评估符号表达式

Viz*_*zag 5 matlab

我试图在某些输入值处评估一个无限余弦系列的函数.

编辑:发布图像来描述无限系列的样子 在此输入图像描述

我编写了以下代码来在MATLAB中描述它.

function func = cosfun_hat(a,i)
    syms m x;

    assume(m,'integer');
    assumeAlso(m > 0);

    sum(x) = sqrt(1-a^2)*symsum(sqrt(2)*a^m*cos(i*sym(pi)*x*2^m+1),m,0,Inf);
    func(x) = sum(x);
end
Run Code Online (Sandbox Code Playgroud)

我想评估返回的'函数' func来获取某些输入范围的数值x_in = 0:0.001:1.

%Trying to evaluate func at x = 2
%In the command window I write
func = cosfun_hat(0.5,2);
func(2)
Run Code Online (Sandbox Code Playgroud)

返回符号表达式:

(2^(1/2)*3^(1/2)*sum((1/2)^m*(exp(- pi*exp(m*log(2))*4*i - i)/2 + exp(pi*exp(m*log(2))*4*i + i)/2), m == 0..Inf))/2
Run Code Online (Sandbox Code Playgroud)

我试着subs用来评估表达式:

%In the command window
syms y;
w(y) = func(y);
y = 2;
subs(w);
Run Code Online (Sandbox Code Playgroud)

但是这会返回相同的符号表达式.我是符号MATLAB的新手.

谢谢!

编辑根据@NickyMattsson的评论,我试过了

vpa(func(2)) 
Run Code Online (Sandbox Code Playgroud)

返回表达式的数值.但是, vpa(func(0.1))返回一个符号表达式:

ans =

1.2247448713915890490986420373529*numeric::sum((1/2)^m*(exp(- (pi*exp(m*log(2))*i)/5 - i)/2 + exp((pi*exp(m*log(2))*i)/5 + i)/2), m == 0..Inf)
Run Code Online (Sandbox Code Playgroud)

使用相同的问题double(func(0.1)),double不返回任何东西,卡住了.

Viz*_*zag 4

找到了一种无需使用符号 MATLAB 即可实现的方法。

function func = cosfun_hat(a,i,x)
    m = 0;
    sum = zeros(1,length(x));
    sum2 = Inf(1,length(x));
    while max(sum2-sum) > 1e-16
        disp(m);
        sum2 = sum;
        sum = sum + sqrt(1-a^2)*sqrt(2)*a^m*cos(i*pi*x*2^(m+1));
        m = m+1;

    end
    func = sum;
end
Run Code Online (Sandbox Code Playgroud)

总和在 100 次迭代内收敛。

现在如果我这样做的话

%In command window
x_in = -2:0.001:2;
f = cosfun_hat(0.6,2,x_in);
plot(x_in,f);
Run Code Online (Sandbox Code Playgroud)

我明白了情节:

在此输入图像描述

感谢大家的帮助!