【问题标题】:Secant method for e^(x) matlabe^(x) matlab的正割法
【发布时间】:2016-03-02 03:32:24
【问题描述】:

我正在尝试编写 f(x)=e^(-x)-sin(x) 的割线法以找到最小的正根。我的代码似乎出错了。

%// Initial values and tolerance
x(0) = 2;
x(1) = 10;
f = @(x) exp(-x)-sin(x);

error = 0.001;

%// Different iterations
for k=0:100

    x(k+1) = x(k) - (f(x(k)))*((x(k) - x(k-1))/(f(x(k)) - f(x(k-1))));

    if abs(x(k)-x(k-1)) < error
        return;
    end
end

【问题讨论】:

  • 在 k=0 时,x(k-1) 是 x(-1),for 循环不应该从 1 开始。
  • 你不能在 Matlab 中访问x(0),所以应该从 2 开始

标签: matlab numerical-analysis


【解决方案1】:

为什么会出错?

正如您的问题的 cmets 中所述,vector(1D matrix) indices in matlab run from 1 to end,因此在您的情况下,您尝试访问代码中各个位置的无效索引:

%// Initial values and tolerance
x(0) = 2;                         %// <-- invalid index
x(1) = 10;
f = @(x) exp(-x)-sin(x);

error = 0.001;

%// Different iterations
for k=0:100
                     %// for k=0: x(k) and x(k-1) both invalid indices
                     %// for k=1: x(k-1) invalid index
    x(k+1) = x(k) - (f(x(k)))*((x(k) - x(k-1))/(f(x(k)) - f(x(k-1))));

    if abs(x(k)-x(k-1)) < error
        return;
    end
end

更正的代码

我们更正了上述无效索引案例(还将您的 for 循环更改为 while 循环):

%// Function to (attempt) to find a root to
f = @(x) exp(-x)-sin(x);

%// Initial values and tolerance
x(1) = 2;
x(2) = 10;
error = 0.001;

%// Different iterations
k=2;
maxIt = 100;
while (abs(x(k)-x(k-1)) > error) && (k-1 <= maxIt)
    x(k+1) = x(k) - f(x(k))*(x(k) - x(k-1))/(f(x(k)) - f(x(k-1)));
    k = k + 1;
end

%// print result
disp(['x(end) = ' num2str(x(end)) ...
  ', f(x(end)) = ' num2str(f(x(end))) ...
  ', iterations: ' num2str(k-2)]);

产生结果

x(end) = 6.285, f(x(end)) = -4.9315e-10, iterations: 7

【讨论】:

  • 我不认为从 for 更改为 while 会更好。即使我理解你为什么要使用它,这也没什么花哨的。
  • @R.Bergamote 因为我在while 循环表达式/签名的不变量中包含了迭代器k,所以我想说这是一个口味问题,因为两个循环变体,在这种情况下,非常相似。然而,有价值的是,您指出 while 循环并没有使它变得更好(我没有明确说明;但是我意识到读者可能从上面推断出这样的陈述)。感谢您的反馈。
  • 从代码的角度来看是完全一样的,但是我不推荐它来调试和理解代码。否则这是一个非常有效的方法
  • 如何找到最小的正根?
  • 我尝试了 0.0001 的容差,但我一直得到一个高根?我做错了吗?
猜你喜欢
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2021-02-03
  • 2016-11-17
  • 2016-12-29
  • 1970-01-01
相关资源
最近更新 更多