加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载]MATLAB计算幂级数出现复数(转载)

(2015-08-25 15:39:09)
标签:

转载

自己计算出现问题了,有答案,没大懂。答案在http://wsummer114.blog.163.com/blog/static/120719072201134101135772/

MATLAB计算幂级数出现复数,于是需要一个解决方案。解决过程如下:
1 用MATLAB计算(-8)^(1/3),得到的结果为:1.0000 + 1.7321i。显然这个不是我要的实数解。
2 将这个表达式写为:sign(-8)*abs(-8)^(1/3),得到的结果为:-2。显然这个是我要的实数解。其中的sign函数表示取参数的符号,对正数返回1,负数返回-1,0则返回0;abs函数表示求绝对值。这两个函数都很简单,详情可以自己查帮助文档。

对于产生这个问题的原因,经过网上的搜索,发现有一个地方说的比较清楚,链接如下:
貌似在实数和复数域中,对(-8)^(1/3)进行求解,确实能得到不只一个解。求所有方根的示例代码如下:
a=-2;
m=[0,1,2,3,4];
R=abs(a)^0.2;
Theta=(angle(a)+2*pi*m)/5;
rrr=R*exp(i*Theta);
运行上述代码得到的结果如下:
0.9293 + 0.6752i  -0.3550 + 1.0925i  -1.1487 + 0.0000i  -0.3550 - 1.0925i   0.9293 - 0.6752i
上述代码得其中第三个解为实数解,其他的都是复数解。所以当我们直接写(-8)^(1/3)的时候,它会返回多个解中的第一个。如上面的链接中所说到的,求a^b,应该写为a*abs(a)^(b-1)。这样得到的结果就是实数解。

上述内容是从别的地方copy过来的,在此向原作者致意,感谢他带来的帮助。接下来的部分是自己根据需要写的一段代码,功能是找到一个字符串中,需要进行形式的转换以得到实数解的部分,将其替换为需要的形式,然后单独计算,并将计算结果拷贝到替换之前的那个字串在原字符串中的位置上。这一考虑是因为自己要处理的字符串比较长,需要迭代处理。
代码如下,有问题请留言讨论:

% 待匹配字符串
str='(-2-2-2-2)^(1/3)';
% real_num匹配实数:实数|(实数)
real_num_ele='-?d+(.d+)?';
real_num='(real_num_ele)|((real_num_ele))';
% expr匹配括号内的表达式
expr='(real_num)([+|-|*|/](real_num))*';
% power_expr匹配幂级数运算表达式
power_expr='((expr))^((expr))';

% 字符串替换,构造模式匹配字符串
real_num=strrep(real_num, 'real_num_ele', real_num_ele);
expr=strrep(expr, 'real_num', real_num);
power_expr=strrep(power_expr, 'expr', expr);
pat=power_expr;

% 获取匹配的文本
content=regexp(str, pat, 'match');

% trans_pat,trans_tarForm分别表示转换计算方式的匹配字符串和目标计算形式
trans_pat='((.*))^((.*))';
trans_tarForm='sign($1)*(abs($1))^($2)';
%得到的结果为cell类型,需要转换为矩阵类型
content_mat=cell2mat(content);
根据正则表达式替换content中的内容
trans_str=regexprep(char(content_mat), trans_pat, trans_tarForm);
% 执行替换后的内容,计算求得实数解
trans_val=eval_r(trans_str)

上述代码的执行结果为:
trans_val =
    -2

这个结果正是自己需要的实数解。

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有