cannor 发表于 2006-12-5 20:43

求助:牛顿下山法解非线性方程组的程序

各位大侠能不能给个   牛顿下山法   解非线性方程组的程序!!!

happy 发表于 2006-12-6 11:03

function x = mynewton2(f, x0, epsilon)
% 用 Newton 下山法求 f(x)=0 的近似根
%
% 调用方式: x = mynewton(f,x0,epsilon)
%       f -- 函数文件(必须是符号函数)
%      x0 -- 迭代初始点
% epsilon -- 精度要求

if ~isa(f,'sym')
    fprintf('\n Error: f is not a symbolic function!\n'); return;
end
dfx = diff(f);
iter_max = 100; % 设置最大迭代步数
x(1) = x0;
fprintf('\n       x(k+1)         f(x(k+1)) \n');
for k = 1 : iter_max
    fxk = subs(f,x(k));
    if abs(fxk)<epsilon, break, end
    dfxk = subs(dfx,x(k));
    if dfxk==0, fprintf('\n Error: f''(%f)=0!\n',x(k)); return; end
    dk = -fxk/dfxk; delta=1;
    x(k+1) = x(k) + delta*dk;   
    while abs(subs(f,x(k+1))) >= abs(fxk)
      delta = delta/2;
      if delta<epsilon,
            fprintf('\n Error: Delta=%g is too small!\n',delta), return;
      end
      x(k+1) = x(k) + delta*dk;
    end
    fprintf('k=%-3d%10.8e%10.8e \n',k,x(k+1),subs(f,x(k+1)));
end
x = x(k);

% END

来自:潘建瑜的个人网页

[ 本帖最后由 happy 于 2006-12-6 11:04 编辑 ]

happy 发表于 2006-12-6 11:05

例子:

求 sin(x)-x/6=0 的正根

>> f = sym('sin(x)-x/6');
>> x=mynewton(f,1.6,1e-4)
>> x=mynewton2(f,1.6,1e-4)

cannor 发表于 2006-12-6 15:22

谢谢!!!!

gugu0615 发表于 2006-12-11 19:20

关于牛顿下山的疑问

对于牛顿下山是不是任选的初始点都可以收敛呢?
楼上的算法每次只能算出一个根,而且必须在已知初始点的情况下,那其他的根呢?
谢谢@_@
页: [1]
查看完整版本: 求助:牛顿下山法解非线性方程组的程序