用割线法求根,我感觉逻辑上对,但是不知道为什么运行不出来,麻烦各位帮忙给看看
function [k,y,n] = secant(f,x0,x1,epsilon)
syms x
n = 1;
fx1 = subs(f,x,x1);
while norm(fx1) > epsilon && n<1000
fx0 = subs(f,x,x0);
x2 = x1-fx1*(x1-x0)/(fx1-fx0);
x0 = x1;
x1 = x2;
n = n+1;
end
k = vpa(x1);
y = fx1;
然后我运行
syms x
fun = x^3-x^2-x-1;
[k,y,n] = secant(fun,2,1,1e-6)
答案应该是1.8多,但是用这个代码运行不出来。
建议这种运算不要用符号运算,syms这种东西是流毒,贻害无穷(syms除了推公式,一无是处,能避免尽量避免)
clc;clear
fun = @(x) x^3-x^2-x-1; % 这里直接定义f是x的函数句柄
[k,y,n] = secant(fun,0.1,2,1e-6)
function [k,y,n] = secant(f,x0,x1,epsilon)
n = 1;
fx1 = f(x1);
while norm(fx1) > epsilon && n<1000
fx0 = f(x0);
x2 = x1-fx1*(x1-x0)/(fx1-fx0);
x0 = x1;
x1 = x2;
fx1 = f(x1); % 这里缺了一项
n = n+1;
end
k = x1;
y = fx1;
end
结果
k =
1.839286655041187
y =
-5.479815636810770e-07
n =
8