2015-02-06 3 views
1

У меня есть цикл, который суммирует значения функции называется pdfomegatДЛЯ петель в MATLAB и численной ошибки

omegat= -1.9999:0.01:+1.9999; 
sum1=0; 

for j=1:length(omegat) 

    func(j)=pdfomegat(j)*0.01; 
    sum1=sum1+func(j); 
end 

    c1=sum1; 

Мой второй цикл немного отличается цикл и выглядит следующим образом

sum2=0; 
syms t 
for j=1:length(omegat) 

    func2(j)=t*pdfomegat(j)*0.01; 
    sum2=sum2+func(j); 
end 

    c2=sum2; 

Я знаю факт, что c1 равен 1. Однако заметьте, что во втором цикле я ничего не меняю, а умножаю на символьный символ t. Насколько я понимаю,

c2 = 0.99999464659732599597363744692302 * t.

Почему нет c2 = t?

Есть ли способы исправить это, я не могу использовать круглую функцию, потому что она символична .. Любые мысли?

+0

Должен ли я читать документ, чтобы узнать ответ :)? Я предполагаю, что в коде нет ничего плохого. Это что-то для самого MATLAB? @Nitish – George

+0

Matlab использует представление с плавающей запятой для нецелых чисел. К сожалению, они не имеют бесконечной точности. Существуют методы ограничения ошибки (например, суммы чисел от наименьшего до наибольшего), но в конечном итоге единственный способ - использовать только целые числа. –

+0

Есть ли способ, я могу это исправить? @AndrewPiliser. Моя проблема требует многого точности :( – George

ответ

0

После того, как ваша петля вызовет функцию double() на ваш символический номер, чтобы преобразовать ее в обычное число, а затем вызвать функцию round.

+0

Спасибо, вы имеете в виду double (c2)? Если я это сделаю, я получу ошибку Ошибка в команде MuPAD: DOUBLE не может преобразовать входное выражение в двойной массив. – George

+0

Я не думаю, что вы можете использовать либо double, либо vpa, потому что у меня есть символическое выражение. – George

+0

Вы можете извлечь коэффициенты, используя ['coeffs'] (http://www.mathworks.com/) help/symbolic/coeffs.html), а затем округлить их. –

Смежные вопросы