【问题标题】:MATLAB code glitch at the endMATLAB代码故障在最后
【发布时间】:2013-09-30 04:28:00
【问题描述】:

我是新来的。

场景描述:

我已经编写了 MATLAB 代码来使用 (-1)^j*x^(2j+1)/(2j+1) 从 j=0 到 n 的部分和 S_n(x)=Sum!来近似 sin x。我已经编写了一个计算机程序来通过方法评估这个部分总和

LS:计算并求和从最大项到最小项的最后一项

SL:以相反的顺序进行计算。

我使用我的程序通过 LS 和 SL 两种方法计算 x = 0.1、1 和 10 的 S_n(x),并将结果与​​ 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

提前致谢。

【问题讨论】:

  • (k) * 10^1000 / 1000! = Inf / Inf = NaN
  • 2.761090925979680 -0.544021110889270 怎么样?
  • 2.76 是因为 10 次多项式在更早的时候偏离正弦 - 尝试绘制 sin(0:0.01:10) 与 LS(10,10,0:0.01:10); (可能需要矢量化)。
  • 只是注释:尽量避免使用log作为变量名,因为它实际上是built-in function的名称
  • @Anonymous - 与Colin 相同,最好也是not to use i as a variable name in Matlab

标签: matlab


【解决方案1】:

1) sin_taylor(10) == 2.76 是因为 20 次多项式逼近在 x 的值小得多时偏离正弦。

2) 序列 x^n / n!对于 |x|>1,不是单调的,但在 n=6 左右具有最大值;因此,与 |x|

3) 当 n 很大时,提名者和分母 (10^n, n!) 都将表示为无穷大。 Inf / Inf 定义为 NaNNaN + 任何东西 == NaN。 这与 partial_sum(10, 100) 不同,后者将项求和 (x / inf == 0)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多