Установка переменных с помощью 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)) делает это, используя переменную точность.

Другие вопросы по тегам