我试图通过vpa
(变量精度算术)设置变量。如果我试试
a=vpa(tanh(1))
然后根据需要a=0.76159415595576485102924380043987
。现在我尝试循环:
a=[];
for i=1:3
a(i)=vpa(tanh(1));
end
但是,现在当我输出a(1)
时,我只得到值0.761594155955765
。为什么我没有像第一种情况那样得到最后的数字?
答案 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))
使用变精度计算双曲正切。