我正在尝试按照我的老师模型做一个简单的False Position代码,但无法让它真正起作用。我不知道我的if-else是否正确或只是说Method Failed
,但我知道应该有P=3.0571
和i=16
的答案。对编程和matlab来说是全新的,所以任何帮助都会受到极大的重视。谢谢
%False Position
%(x^2-4x+4-lnx=0 for 2<=x<=4)
p0=2; p1=4; TOL=10^-6; N=100;
q0=p0^2-4*p0+4-log(p0);
q1=p1^2-4*p1+4-log(p1);
i=2;
while i<=N
p=p1-q1*(p1-p0)/(q1-q0);
if abs(p-p1)<TOL
disp('False Position')
p
i
break
end
i=i+1;
q=p^2-4*p+4-log(p);
if q*q1<0
p0=p1;
q0=q1;
else
p1=p;
q1=q;
end
end
if i>=N disp('Method Failed')
end
答案 0 :(得分:1)
我对伪位置方法并不是很熟悉,但似乎你试图通过在每一步缩小一些间隔来找到某个函数的零点,方法是根据某些条件将左边或右边设置为某个中间值。我认为您if
中存在错误:如果q*q1<0
,您将左边缘设置为与右边缘相同的值。您可能需要将其更改为:
if q*q1<0
p0=p;q0=q;
else
p1=p;q1=q;
end
请注意,我仅将p1
更改为p
,将q1
更改为q
。
对于其余部分,您的代码看起来还不错,但我建议您进行一些小修改以使其更具可读性:将所有p
和q
更改为x
和y
,并且可能将您的函数定义为函数句柄(类型help function_handle
)。现在,您正在3个不同的地方定义您的功能。如果你想在将来改变你的功能,你必须在所有这些地方做出完全相同的改变,否则你就会有一个错误。最好not repeat yourself并将您的函数定义为fun = @(x) x^2-4*x+4-log(x);
一次,然后将其用作y0 = fun(x0)
和y1 = fun(x1)
等。