在循环中用vpa设置变量

时间:2015-04-25 22:45:52

标签: matlab floating-point precision symbolic-math arbitrary-precision

我试图通过vpa(变量精度算术)设置变量。如果我试试

a=vpa(tanh(1))

然后根据需要a=0.76159415595576485102924380043987。现在我尝试循环:

a=[];
for i=1:3
    a(i)=vpa(tanh(1));
end

但是,现在当我输出a(1)时,我只得到值0.761594155955765。为什么我没有像第一种情况那样得到最后的数字?

1 个答案:

答案 0 :(得分:2)

您的代码存在两个问题。

首先,如果您在class(a)循环后运行for,则会看到a'double'而不是'sym'。这是因为您最初将a分配为空双精度数组:a = [];。每次向其中插入符号变量精度值时,它们都会转换为与a相同的类。

要正确构建符号数组,您需要按原样分配:

a = sym([]);
for i = 1:3
    a(i) = vpa(tanh(1));
end
a
class(a)

更好的是,指定最终尺寸:

n = 3;
a = sym(zeros(n,1)); % Or a = zeros(n,1,'sym');
for i = 1:n
    a(i) = vpa(tanh(1));
end
a
class(a)

在您的情况下,上述两个选项都等同于以下选项,因为您将vpa作为每个元素的最后一个操作:

n = 3;
a = zeros(n,1);
for i = 1:n
    a(i) = tanh(1);
end
a = vpa(a);


这导致了第二个问题,即你的计算并没有真正利用变量精度。在对它们执行操作之前,您需要确保将所有值转换为符号或变量。例如:

a = vpa(tanh(1)) % Calculate tanh(1) as double then convert to vpa
b = tanh(vpa(1)) % Calculate tanh(1) using actual variable precision
a-b

返回0.000000000000000037090214482164921742783153748416。换句话说,vpa(tanh(1))以双精度计算双曲正切,tanh(vpa(1))使用变精度计算双曲正切。