Matlab错误定位方法

时间:2016-09-20 02:06:03

标签: matlab iteration

我目前正在做家庭作业,要求我使用假位置方法估算一个值。我觉得我几乎所有的东西都在那里,但是我对我的if语句感到很不满。所以我必须确定函数的正定实根:ln(x ^ 2)= 0.7使用假位置方法,迭代3次,xl = 0.5,xu = 2。我在底部附上了正确的答案,以帮助我更好地解释我的问题。我有三个具体问题需要帮助。

1)。首先,在Xl值的第三次迭代中,我的代码仍将其视为1.625而不是正确的1.25。我不明白为什么它这样做,因为我的if语句应该阻止这个。它正是在第二次迭代中正确地改变了这个值而不是第三次。

2)。我还需要帮助找到错误。这部分我非常坚持。我知道找到错误的等式,但我的问题是如何跟踪什么是xr_new和xr_old。我不确定我是否想要添加一些比较,以确定它是否在计算之前发生变化或者是什么。

3)。我还想输出我的值并构建一个类似于提供的解决方案的表。我以前使用表的经验是将值直接硬编码到它中,并且在找到值时我很难构建表。我知道我需要for循环中的表,我一次只构建一个单元格,但是在这个领域没有经验可以开始。

我希望这不是太多的帮助,要求我有相互间的matlab技能​​,这是我不得不做的一个更难的问题。任何帮助都非常感谢。

clc; clear;
f= @(x) log(x.^2) - 0.7;
x = -3: .005 : 3;
figure(1)
grid on
hold on
plot (x,f(x))

% bisection method with 3 iterations
xl = 0.5
xu = 2

%Table = table(iteration, xl , f(xl), xu, f(xu), xr, f(xr), Ea) 

for i = 1:1:3

    F_xl = f(xl)
    F_xu = f(xu)
    xr = .5*(xl+xu)
    F_xr = f(xr)

    if ((F_xu*F_xl) < 0)
        xl = xr

    else
      xu = xr
    end


    %Error = abs(xr_new-xr_old)/xr_new
end

The correct soluton displayed in a table below:

1 个答案:

答案 0 :(得分:0)

以下代码提供了所需的输出,代码前面是plot()

  1. if条件因您使用F_xl而非F_xr而失败。 if ((F_xu*F_xr) < 0)给出了理想的结果。
  2. 我们可以使用xr的向量在每次迭代中存储xr的值,并使用表达式abs(xr_new-xr_old)/xr_new)来查找错误。我只是将第一个错误值保留为零。
  3. 由于我们有向量,因此可以在循环外部使用table()来获得所需的输出
  4. 代码:

    iterations = (1:3)';
    xl = zeros(3,1);
    xu = zeros(3,1);
    xr = zeros(3,1);
    F_xl = zeros(3,1);
    F_xu = zeros(3,1);
    F_xr = zeros(3,1);
    Error = zeros(3,1);
    % bisection method with 3 iterations
    xl(1) = 0.5;
    xu(1) = 2;
    for i = 1:3
        F_xl(i) = f(xl(i));
        F_xu(i) = f(xu(i));
        xr(i) = .5*(xl(i)+xu(i));
        F_xr(i) = f(xr(i));
        if(i<3)
            if ((F_xu(i)*F_xr(i)) < 0)
              xl(i+1) = xr(i);
              xu(i+1) = xu(i);
            else
              xu(i+1) = xr(i);
              xl(i+1) = xl(i);
            end
        end
        if(i>1)
            Error(i) = abs(xr(i)-xr(i-1))*100/xr(i);
        end
    end
    T = table(iterations,xl,F_xl,xu,F_xu,xr,F_xr,Error);