MATLAB 如何让输出结果为数值而不是字母
syms a p s u x
p=factorial(20);
for x = 20:2
a=x+1
u=factorial(x-1)
s=u/(a+p);
end;
vpa(s,50)
结果却是
s=
s
我想输出一个具体的数值,怎么办 展开
存在问题:
1、楼上回答有问题,数值运算无法实现高精度算法(vpa);另一方面,循环体里面对s赋值,和s是否定义成符号变量没有关系,第一行代码完全可以省略。
2、for循环的范围x = 20:2根本就是空的,循环体不可能执行。猜测你是不是想要x=0:-1:2?
3、事实上,p=actorial(20)本身已经超出浮点数的精度,按照现在的写法,后面再怎么算也不可能保证精度了。应该用p=maple('20!'),后面的一个阶乘也应该改。
参考代码:
syms a p s u x
p=maple('20!');
for x = 20:-1:2
a=x+1;
u=maple([int2str(x-1) '!']);
s=u/(sym(a)+p);(a+p);
end;
vpa(s,50)
计算结果:
ans =
.41103176233121648534095773290829713106809404879378e-18
如果用原来的代码计算(仅修改x=20:-1:2),结果是:
ans =
.41103176233121648440650172397766137533562614150282e-18
虽然都输出了50位小数,但真正的有效数字是不一样的,后面一种不准确。
谢谢,不过我需要的循环范围是200至2或2000至2,请问怎么改呢?谢谢!
结果应该差不多是:.293166287411……
哦,而且题目有问题,应该在 s=u/(a+p) 后还有一行p=s
把20改成200就是了。另外,原来的代码适合于Maple内核的MATLAB(2008a或之前),改用sym适应性更好一些(在MuPad内核的2012b测试没问题):
p=sym('20!');
for x = 200:-1:2
a=x+1;
u=sym([int2str(x-1) '!']);
s=u/(sym(a)+p);
p=s;
end;
vpa(s,50)
还有,不知道你修改循环范围是否同时修改最前面的p=factorial(20)?
改或者不改,分别得到的结果是:
对于20!:
ans =
.29390546725462483805798756478052731717855039195997
对于200!:
ans =
.29215034060291125268807446054787796775350936096005
和你说的结果都有差别,再看看是哪里出问题了?
顺便说一句,用factorial计算阶乘肯定是不可取的:一是不能保证精度(不过对于20!而言还可以,其有效数字只有15位,还在double的精度范围之内),另一方面,factorial能计算的最大阶乘是170!,一旦计算factorial(171)就超出浮点数的最大表示范围,得到Inf了。
把第一行去了,进行数值运算就行了。
去了第一行显示:??? Undefined function or variable 's'.
syms a p s u x
p=factorial(20);
for x =1:2
a=x+1
u=factorial(x-1)
s=u/(a+p);
end;
vpa(s,50)
你的“x”需要取恰当的值
2013-10-18