2015-11-18 4 views
2

У меня есть следующие строки в моем коде:Inf * 0 в Matlab

1 - sqrt(pi/2)*sig*sqrt(Eb)*theta_l*exp(theta_l^2*sig^2*Eb/2).*(1 + erf(-theta_l*sig*sqrt(Eb)/sqrt(2))); 

Когда я оцениваю это выражение для следующих параметров: Eb = 6324.6; sig = 1/sqrt(2); theta = 0.7;, я получаю Нэн. Я знаю, что это происходит от продукта Infinity на 0.

Однако, когда я тестировал ту же строку в Mathematica, результат был конечным. Как я могу решить эту проблему? Благодарю.

ответ

2

Проблемная часть вашей функции: exp(Eb/2). Значение Eb настолько велико, что результат его возведения в степень не может быть представлен числом с плавающей запятой двойной точности (численная точность в Mathematica, очевидно, выше или динамическая, вероятно, за счет производительности), поэтому вы получаете Inf.

Однако вы можете просто изменить единицы ввода на свою функцию, чтобы остановить это. Например, если мы определим вашу функцию как анонимную функцию ...

funky = @(Eb, sig, theta_l) ... 
     1 - sqrt(pi/2)*sig*sqrt(Eb)*theta_l*exp(theta_l^2*sig^2*Eb/2) .* ... 
     (1 + erf(-theta_l*sig*sqrt(Eb)/sqrt(2))); 

Тогда

funky(6324.6/1000, (1/sqrt(2))/1000, 0.7/1000) == ... 
funky(6324.6/1e6, (1/sqrt(2))/1e6, 0.7/1e6) == ... 
funky(6324.6/1e10, (1/sqrt(2))/1e10, 0.7/1e10) % etc 
+0

Спасибо learnvst за ваш ответ. Проблема в том, что мне понадобится это значение позже, поэтому я надеялся, что можно сделать некоторую модификацию таким образом, чтобы иметь конечное значение. – kagami

+0

@kagami, если ваши значения больше, чем базовые MATLAB (и/или ваш компьютер), могут обрабатываться, вам придется искать библиотеки с расширенной точностью, такие как 'gmp'. –

+0

@CarlWitthoft, мне нужно объединить эту библиотеку с MATLAB или это на другом языке? – kagami

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