声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2542|回复: 2

[编程技巧] maker系列--最速下降法求线性方程

[复制链接]
发表于 2005-7-28 17:49 | 显示全部楼层 |阅读模式

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

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

x
  1. function x=maker6(A,b)
  2. %最速下降法求线性方程
  3. %基于公式如下:
  4. %r0=b- Ax0,a=(r0,r0)/(Ar0,r0),x1=x0+a*r0,r1=b-Ax1;
  5. %上式根据||r0||< errs,(errs为一个非常小的数据)
  6. %chinamaker
  7. %2003.12.27
  8. numer=length(A);
  9. x0=ones(numer,1);
  10. errs=1;
  11. while  errs>0.001
  12.     r0=b-A*x0;
  13.     a=sum(r0.*r0)/sum((A*r0).*r0);
  14.     x1=x0+a*r0;
  15.     r1=b-A*x1;
  16.     x0=x1;
  17.     r0=r1;
  18.     errs=norm(r1);
  19. end
  20. x=x1;
  21. %end
复制代码


< BR>实例
>> A=[4,3,0;3,4,1;0,-1,4];
>> b=[24;20;-24];
>> x=maker6(A,b)

x =

    2.9998
    4.0002
   -5.0000
回复
分享到:

使用道具 举报

 楼主| 发表于 2005-7-28 17:50 | 显示全部楼层
介绍一种求多元方程组的方法
come from shumo.com
%简单的GAUSS消去法
%a为系数方阵,b为右端向量
  1. function x = gauss(a,b)
  2. [n,m] = size(b);
  3. if size(a) == [n,n]
  4.     for i = 1 : (n - 1)
  5.         if a(i,i) == 0 error('Divide by zero');end
  6.         b((i + 1):n,:) = b((i + 1):n,:) - a((i + 1):n,i)*b(i,:)/a(i,i);
  7.         a((i + 1):n,i:n) = a((i + 1):n,i:n) - ...
  8.             a((i + 1):n,i)*a(i,i:n)/a(i,i);
  9.         [a,b]
  10.     end
  11.     if a(n,n) == 0,error('Divide by zero');end
  12.     x(n,:) = b(n,:)/a(n,n);
  13.     for i = n-1:-1:1
  14.         x(i,:) = b(i,:) - a(i,(i + 1):n)*x((i + 1):n,:)/a(i,i);
  15.     end
  16. else,error('Divede of matrix must agree');
  17. end
复制代码


%请大家赐教其他的好方法
发表于 2006-5-23 11:11 | 显示全部楼层
不错,不错谢谢了!!!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-25 15:18 , Processed in 0.058233 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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