首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Matlab解决新课题重新编排后的符号函数

Matlab解决新课题重新编排后的符号函数
EN

Stack Overflow用户
提问于 2014-05-27 00:48:37
回答 1查看 637关注 0票数 0

我有一个公式,我用它来计算给定的Ps,它可以被重新排列为Ps给定的Ps:

代码语言:javascript
复制
Vo=(Ps)*(BWc/BWs)*Ro*(10^((-(3+2*n)*LdB)/10))*Rpd

我想在MATLAB中为此做一个通用的函数。我首先声明一个符号函数,然后用数字替换的方式来求解它:

代码语言:javascript
复制
syms Ps BWc BWs Ro n LdB Rpd;
Vo(Ps,BWc,BWs,Ro,n,LdB,Rpd)=(Ps)*(BWc/BWs)*Ro*(10^((-(3+2*n)*LdB)/10))*Rpd;
Vo(250,0.12,1000,0.01,4,0.5,75)

我希望能够重新安排Ps的符号函数,并再次求解:

代码语言:javascript
复制
 Ps(Vo,BWc,BWs,Ro,n,LdB,Rpd)= solve('Vo=(Ps)*(BWc/BWs)*Ro*(10^((-(3+2*n)*LdB)/10))*Rpd','Ps');
 Ps(0.0063,0.12,1000,0.01,4,0.5,75)

然而,上述两行不起作用。我得到了上面最后一行的错误:“操作符必须转换为逻辑标量值。”我也尝试过:

代码语言:javascript
复制
syms Vo Ps BWc BWs Ro n LdB Rpd;
Vo(Ps,BWc,BWs,Ro,n,LdB,Rpd)=(Ps)*(BWc/BWs)*Ro*(10^((-(3+2*n)*LdB)/10))*Rpd;
Vo(250,0.12,1000,0.01,4,0.5,75)
Ps(Vo,BWc,BWs,Ro,n,LdB,Rpd)=(Vo)/((BWc/BWs)*Ro*(10^((-(3+2*n)*LdB)/10))*Rpd);
Ps(0.0063,0.12,1000,0.01,4,0.5,75)

为此目的使用符号工具箱的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 01:29:34

问题可能是因为您有一个名为Vo的变量,并且还使用Vo来定义函数。你不能这样做,但仍然同时使用两者。这实际上是可变范围的一个问题。下面是如何成功地使用solve

代码语言:javascript
复制
syms Vo Ps BWc BWs Ro n LdB Rpd;
Vo_fun(Ps,BWc,BWs,Ro,n,LdB,Rpd) = Ps*(BWc/BWs)*Ro*(10^((-(3+2*n)*LdB)/10))*Rpd
Vo_fun(250,0.12,1000,0.01,4,0.5,75)
Ps_fun(Vo,BWc,BWs,Ro,n,LdB,Rpd) = solve(Vo==Vo_fun,Ps)
Ps_fun(0.0063,0.12,1000,0.01,4,0.5,75)

在这种情况下,我认为根本没有必要使用符号数学。简单的匿名函数就足够了,例如:

代码语言:javascript
复制
Vo = @(Ps,BWc,BWs,Ro,n,LdB,Rpd)(1/10^((LdB*(2*n + 3))/10)*BWc*Ps*Ro*Rpd)/BWs;
Ps = @(Vo,BWc,BWs,Ro,n,LdB,Rpd)(10^((LdB*(2*n + 3))/10)*BWs*Vo)/(BWc*Ro*Rpd);

请注意,在函数的命名方面,这里的范围没有问题。如果其他参数没有改变,您可以将这些参数变成VoPs的函数

代码语言:javascript
复制
BWc = ...
BWs = ...
Ro = ...
n = ...
LdB = ...
Rpd = ...
Vo = @(Ps)(1/10^((LdB*(2*n + 3))/10)*BWc*Ps*Ro*Rpd)/BWs;
Ps = @(Vo)(10^((LdB*(2*n + 3))/10)*BWs*Vo)/(BWc*Ro*Rpd);

或者,您可以创建一个处理输入的单个常规函数:

代码语言:javascript
复制
function out=VoPs(name,value,BWc,BWs,Ro,n,LdB,Rpd)
if (ischar(name) && strcmp(name,'Ps')) || (isa(name,'sym') && logical(name==sym('Ps')))
    Ps = value;
    Vo = Ps*(BWc/BWs)*Ro*(10^((-(3+2*n)*LdB)/10))*Rpd;
elseif (ischar(name) && strcmp(name,'Vo')) || (isa(name,'sym') && logical(name==sym('Vo')))
    Vo = value;
    Ps = Vo/((BWc/BWs)*Ro*(10^((-(3+2*n)*LdB)/10))*Rpd);
else
    error('VoPs:InvalidName','Name input must be ''Vo'' or ''Ps''.')
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23879526

复制
相关文章

相似问题

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