首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab符号:用符号变量向量计算表达式

Matlab符号:用符号变量向量计算表达式
EN

Stack Overflow用户
提问于 2021-12-09 12:59:35
回答 2查看 390关注 0票数 1

我需要用Matlab符号计算以下表达式:

"l“是符号变量的向量,"C_l”也是(与"l“相同的长度,也就是l_max -l_min = 3000-10=2990)。

为了计算这个,我做了:

代码语言:javascript
复制
clear
syms l_min l_max fsky Np var1D varO1
l_min = 10
l_max = 3000
l = sym('l_',[1 (l_max - l_min)])
C_l = sym('C_l_',[1 (l_max -l_min)])

% First observable
var1D = symsum(2/((2*l+1)*fsky*Np^2), l, l_min, l_max)
varO1 = var1D/symsum(C_l, l_min, l_max)^2

Error using symengine
Invalid operands.

Error in sym/privBinaryOp (line 1030)
            Csym = mupadmex(op,args{1}.s, args{2}.s, varargin{:});

Error in / (line 373)
        X = privBinaryOp(A, B, 'symobj::mrdivide');

Error in inequality (line 9)
var1D = symsum(2/((2*l+1)*fsky*Np^2), l, l_min, l_max)

我不知道继续计算上面sigma_o,1^2的表达式。

更新1

第一个方差sigma_{o,1}^2已正确编码。现在,我对第二个方差有困难,但我在计算第二个方差(sigma_{o,2}^2)方面取得了一些进展:

现在,我做到了:

代码语言:javascript
复制
clear
syms l_min l_max fsky Np var1D var2D varO1 varO2
l_min = 10
l_max = 3000
syms l
%l = sym('l_',[1 (l_max - l_min)])
C_l = sym('C_l_',[1 (l_max -l_min)])

% First observable
var1D = symsum(2/((2*l+1)*fsky*Np^2), l, l_min, l_max)
varO1 = var1D/sum(C_l)^2

% Second observable
var2D = symsum(((2*l+1)*fsky*Np^2), l, l_min, l_max)
varO2 = var2D/symsum((2*l+1)*C_l, l, l_min, l_max)^2

但我在最后一行仍然有一个错误:

代码语言:javascript
复制
var2D =

9005901*Np^2*fsky

Error using symengine
Not a square matrix.

Error in sym/privBinaryOp (line 1030)
            Csym = mupadmex(op,args{1}.s, args{2}.s, varargin{:});

Error in ^ (line 330)
        B = privBinaryOp(A, p, 'symobj::mpower');

Error in inequality (line 15)
varO2 = var2D/symsum((2*l+1)*C_l, l, l_min, l_max)^2

问题是,我不知道如何混合经典的"sum“函数和"symsum”符号函数,因为我在除法器中有以下表达式:

代码语言:javascript
复制
varO2 = var2D/symsum((2*l+1)*C_l, l, l_min, l_max)^2

这里有解决办法吗?

更新2

@CrisLuengo

按照你的建议,我试着:

代码语言:javascript
复制
clear
syms l_min l_max fsky Np var1D var2D varO1 varO2
l_min = 10
l_max = 15
syms l
%l = sym('l_',[1 (l_max - l_min)])
C_l = sym('C_l_',[1 (l_max -l_min)])
assume(C_l > 0)

% First observable
var1D = symsum(2/((2*l+1)*fsky*Np^2), l, l_min, l_max)
varO1 = var1D/sum(C_l)^2

% Second observable
var2D = symsum(((2*l+1)*fsky*Np^2), l, l_min, l_max)
varO2 = var2D/(symsum(((2*l+1)*C_l), l, l_min, l_max)).^2

并得到错误:

代码语言:javascript
复制
varO1 =

45894056/(97698825*Np^2*fsky*(C_l_1 + C_l_2 + C_l_3 + C_l_4 + C_l_5)^2)


var2D =

156*Np^2*fsky

Error using symengine
Invalid operands.

Error in sym/privBinaryOp (line 1030)
            Csym = mupadmex(op,args{1}.s, args{2}.s, varargin{:});

Error in / (line 373)
        X = privBinaryOp(A, B, 'symobj::mrdivide');

Error in inequality (line 16)
varO2 = var2D/(symsum(((2*l+1)*C_l), l, l_min, l_max)).^2

我只想象征性地表示以下数量(我有一组夫妻数据(l,C_l),也就是说,我对每个"l“值都有一个相关的"C_l”值。

错误可能从何而来?

更新3

以上第二量的表达可能会引起混淆。我有i=1:N值对(l_i,C_l_i),数量如下所示:

不幸的是,当我在做:

代码语言:javascript
复制
% Second observable
var2D = symsum(((2*l+1)*fsky*Np^2), l, l_min, l_max)
varO2 = var2D./(sum(symsum(((2*l+1).*C_l), l, l_min, l_max))).^2

我上了终端Matlab:

正如您所看到的,我有一个因子156,它出现在每个C_l上,这是错误的,因为我希望将每个C_l的因子 (2*l+1)作为实数:(2*l+1)的计算必须用一个实值,而不是作为符号系数。

更新4

我表达了我的问题:在@drakon101的答复中提出了解决方案,我的加权值总是相同的。

我想得到的是分隔符的以下符号表达式:

如何将变量"l“改为实值(3,5,7,…,5999)?

EN

回答 2

Stack Overflow用户

发布于 2021-12-15 16:19:32

我不知道你想要什么输出,但是根据你上面显示的公式,你的第二条可观察的线条应该是:

代码语言:javascript
复制
% Second observable
var2D = 2*symsum(((2*l+1)), l, l_min, l_max)./(fsky.*Np.^2)
varO2 = var2D./(symsum(((2.*l+1).*C_l), l, l_min, l_max)).^2
票数 2
EN

Stack Overflow用户

发布于 2021-12-18 13:06:02

(代表问题作者发布解决方案,将其移至答案空间)。

我通过编码找到了以下解决方案:

代码语言:javascript
复制
clc
clear all
syms fsky Np l

l_min = 10
l_max = 15
C_l = sym('C_l_',[1 (l_max)]);
assume(C_l > 0);

% Second observable
var2D = symsum(((2*l+1)*fsky*Np^2), l, l_min, l_max)

below=0;
for l=l_min:l_max
   below= below + (2*l+1)*C_l(l);
end

varO2= var2D/(below)^2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70290338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档