Установка переменных с помощью vpa в циклах
Я пытаюсь установить переменную vpa
(арифметика переменной точности). Если я попробую
a=vpa(tanh(1))
затем a=0.76159415595576485102924380043987
по желанию. Теперь я пытаюсь сделать это в цикле:
a=[];
for i=1:3
a(i)=vpa(tanh(1));
end
Тем не менее, теперь, когда я выхожу a(1)
Я просто получаю значение 0.761594155955765
, Почему я не получаю последние цифры, как в первом случае?
1 ответ
Есть две проблемы с вашим кодом.
Во-первых, если вы бежите 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))
делает это, используя переменную точность.