声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3315|回复: 4

[编程技巧] 求助:牛顿下山法解非线性方程组的程序

[复制链接]
发表于 2006-12-5 20:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
各位大侠能不能给个   牛顿下山法     解非线性方程组的程序!!!
回复
分享到:

使用道具 举报

发表于 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 编辑 ]
发表于 2006-12-6 11:05 | 显示全部楼层
例子:

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

  1. >> f = sym('sin(x)-x/6');
  2. >> x=mynewton(f,1.6,1e-4)
  3. >> x=mynewton2(f,1.6,1e-4)  
复制代码
 楼主| 发表于 2006-12-6 15:22 | 显示全部楼层
谢谢!!!!
发表于 2006-12-11 19:20 | 显示全部楼层

关于牛顿下山的疑问

对于牛顿下山是不是任选的初始点都可以收敛呢?
楼上的算法每次只能算出一个根,而且必须在已知初始点的情况下,那其他的根呢?
谢谢@_@
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-19 16:24 , Processed in 0.055655 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表