2013-09-30 6 views
0

Я здесь новый.Сбой кода MATLAB в конце

Описание сценария:

Я написал MATLAB код, чтобы использовать частичную сумму S_n (х) = Sum от у = 0 до п (-1)^J * х^(2j + 1)/(2j + 1)! для аппроксимации sin x. Я написал компьютерную программу, чтобы оценить эту частичную сумму методов

LS: вычислительные и суммируя условия от наибольшего члена первого наименьшему срока последнего

и

SL: делать расчет в обратный порядок.

Я использовал свою программу для вычисления S_n (x) для x = 0,1, 1 и 10 с помощью обоих методов LS и SL и сравнил результаты с sin x. Я использовал n = 10, 100 и 1000.

Вопрос: Я столкнулся с проблемой в последних двух строках моего кода. Он говорит «NaN» (не число), но также показывает отклоняющиеся числа в предыдущем столбце. Что я делаю не так? Может кто-нибудь мне помочь?

Вот мой код:

Первая функция:

function ret = hw1_6_1(x,n) 
ret=((-1)^n)*((x^((2*n)+1))/(factorial((2*n)+1))); 
end 

Вторая функция:

function ret = partialsum(x,n,log) 
%% Begin code 
% j=n 
% 1 to n+1 
% LS 0 to n 
% SL n to 0 
%((-1)^n)*((x^((2*n)+1))/(factorial((2*n)+1))) 
clear sum 
ret = 0; 

if log == 1 
    for i=0:1:n 
    ret= ret + hw1_6_1(x,i) ; 
    i=i+1; 
    end 
elseif log == 0 
    for i=n:-1:0 
    ret= ret + hw1_6_1(x,i) ; 
    i=i+1; 
end 
end 
end 

Наконец, мой основной код:

%% Hw 1 Problem 6 

% Running approximation of sin x 
% LS and SL 
% LS == log=1, SL == log=0 
% x = 0.1, 1, 10 
% n = 10,100,1000 
clear all 
clc 
format long %displays more decimal points 

%% For x = 0.1 

sin1 = sin(0.1); 

% LS 
% n = 10, 100, 1000 Generated in array format 

LS1 = [partialsum(0.1,10,1);partialsum(0.1,100,1);partialsum(0.1,1000,1)]; 

% Now SL 

SL1 = [partialsum(0.1,10,0);partialsum(0.1,100,0);partialsum(0.1,1000,0)]; 

%% For x = 1 

sin2 = sin(1); 

% LS 
% n = 10, 100, 1000 Generated in array format 

LS2 = [partialsum(1,10,1);partialsum(1,100,1);partialsum(1,1000,1)]; 

% Now SL 

SL2 = [partialsum(1,10,0);partialsum(1,100,0);partialsum(1,1000,0)]; 

%% For x = 10 

sin3 = sin(10); 

% LS 
% n = 10, 100, 1000 Generated in array format 

LS3 = [partialsum(10,10,1);partialsum(10,100,1);partialsum(10,1000,1)]; 

% Now SL 

SL3 = [partialsum(10,10,0);partialsum(10,100,0);partialsum(10,1000,0)]; 

%% Comparison stage 

Sines = [sin1;sin2;sin3] 

Approxs = [LS1 SL1 LS2 SL2 LS3 SL3]' 

Мой выход :

Sines = 
    0.099833416646828 
    0.841470984807897 
    -0.544021110889370 


Approxs = 
    0.099833416646828 0.099833416646828 0.099833416646828 
    0.099833416646828 0.099833416646828 0.099833416646828 
    0.841470984807897 0.841470984807897 0.841470984807897 
    0.841470984807897 0.841470984807897 0.841470984807897 
    2.761090925979680 -0.544021110889270     NaN 
    2.761090925979687 -0.544021110889190     NaN 

Заранее спасибо.

+4

(k) * 10^1000/1000! = Inf/Inf = NaN –

+0

Что относительно 2.761090925979680 -0.544021110889270? – Anonymous

+3

2.76 состоит в том, что полином 10-й степени расходится с синусом в гораздо более ранней точке - попробуйте построить sin (0: 0,01: 10) по сравнению с LS (10,10,0: 0,01: 10); (Может потребоваться векторизация). –

ответ

3

1) sin_taylor (10) == 2.76 состоит в том, что полиномиальное приближение 20-й степени отклоняется от синуса при значительно меньшем значении x.

2) Последовательность x^n/n! для | x |> 1, не является монотонным, но имеет максимум при n = 6; таким образом, будут некоторые различия округления по сравнению с случаями, где | x | < = 1, и один подводит итог быстро исчезающей последовательности.

3) И номинант, и знаменатель (10^n, n!) Будут представлены как бесконечности, когда n большой. Inf/Inf определяется как NaN, и NaN + все == NaN. Это отличается от partial_sum (10, 100), где суммируются термины (x/inf == 0).

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