我目前正在做家庭作业,要求我使用假位置方法估算一个值。我觉得我几乎所有的东西都在那里,但是我对我的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
答案 0 :(得分:0)
以下代码提供了所需的输出,代码前面是plot()
if
条件因您使用F_xl
而非F_xr
而失败。 if ((F_xu*F_xr) < 0)
给出了理想的结果。xr
的向量在每次迭代中存储xr
的值,并使用表达式abs(xr_new-xr_old)/xr_new)
来查找错误。我只是将第一个错误值保留为零。 table()
来获得所需的输出代码:
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);