我正在尝试通过 vpa
设置变量(可变精度算术)。如果我尝试
a=vpa(tanh(1))
然后根据需要a=0.76159415595576485102924380043987
。现在我尝试循环执行:
a=[];
for i=1:3
a(i)=vpa(tanh(1));
end
但是,现在当我输出 a(1)
时,我只得到值 0.761594155955765
。为什么我不能像第一种情况那样获得最后一位数字?
最佳答案
您的代码有两个问题。
首先,如果您在 for
循环之后运行 class(a)
,您将看到 a
是一个 'double '
而不是 'sym'
。原因是您最初将 a
分配为空 double 组: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))
以 double 计算双曲正切,而 tanh(vpa(1))
使用可变精度计算双曲正切。
关于matlab - 在循环中使用 vpa 设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871571/