【问题标题】:Evaluate symbolic expression in MATLAB在 MATLAB 中计算符号表达式
【发布时间】:2018-06-27 17:51:30
【问题描述】:

我正在尝试评估一个函数,该函数在某些输入值处是一个无限余弦序列。

编辑:发布一张图片来描述无限系列的样子

我写了以下代码在 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

我想评估返回的“函数”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)

返回符号表达式:

(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

我尝试使用subs 来评估表达式:

%In the command window
syms y;
w(y) = func(y);
y = 2;
subs(w);

但这会返回相同的符号表达式。我对符号 MATLAB 很陌生。

谢谢!

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

vpa(func(2)) 

返回表达式的数值。 然而, 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)

使用double(func(0.1))double 的同样问题不返回任何内容并被卡住。

【问题讨论】:

  • vpa(func(2)) 能解决您的问题吗?
  • @NickyMattsson 感谢您的评论。 vpa(func(2)) 返回数值。但是,如果我使用 vpa(func(0.1)),MATLAB 将返回 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)...

标签: matlab


【解决方案1】:

想出了一种不使用符号 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

总和在 100 次迭代内收敛。

如果我这样做了,

%In command window
x_in = -2:0.001:2;
f = cosfun_hat(0.6,2,x_in);
plot(x_in,f);

我明白剧情了:

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    使用这个命令

    double(func(2))
    

    【讨论】:

    • double(func(2)) 返回一个数值。double(func(0.1)) 不返回任何内容。正如我在问题中所说,我需要评估一系列值x_in = 0:0.01:1,因此我还需要能够获得小数值的结果。
    • func(0.1) 包含复数,可以转换为数值。
    • 怎么会有复杂的部分?无穷级数中的每一项都是实值。
    • 复数可以通过多种方式创建。当我查看 func(0.1) 的结果时,我在输出中看到了复杂的符号。我不生成它。 MATLAB 生成结果。
    • 没有。结果中的'i'是我作为输入而不是iota给出的。它的象征意义。将cosfun_hat(a,i) 更改为cosfun_hat(a,k),您将在获得的结果中看到符号“k”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多