matlab - 在循环中使用 vpa 设置变量

标签 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。为什么我不能像第一种情况那样获得最后一位数字?

最佳答案

您的代码有两个问题。

首先,如果您在 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/

相关文章:

math - 为什么 Gnu Octave 有负零?

matlab - 在 Matlab 中优化循环

matlab - 图像处理——使用FFT放大图像(Matlab代码)

python - 打印任意数量的 float

algorithm - 数值不稳定?

c++ - 如何计算精度为 E=0.0001 的序列 e^(-x) 之和?

ruby-on-rails-4 - Ruby on Rails 精度和比例未按预期运行

java - 更改matlab中的默认JVM版本

c++ - float 变量如何存储不在其范围内的负值?

c - 什么时候下溢?