声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6335|回复: 11

[共享资源] 共轭梯度法的matlab源程序

[复制链接]
发表于 2006-10-11 09:15 | 显示全部楼层 |阅读模式

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

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

x
  1. function g=conjugate_grad_2d(x0,t)
  2. %please input this:conjugate_grad_2d([2,2],0.05)
  3. x=x0;
  4. syms xi yi a
  5. f=xi^2-xi*yi+3*yi^2;
  6. fx=diff(f,xi);
  7. fy=diff(f,yi);
  8. fx=subs(fx,{xi,yi},x0);
  9. fy=subs(fy,{xi,yi},x0);
  10. fi=[fx,fy];
  11. count=0;
  12. while double(sqrt(fx^2+fy^2))>t
  13. s=-fi;
  14. if count<=0
  15. s=-fi;
  16. else
  17. s=s1;
  18. end
  19. x=x+a*s;
  20. f=subs(f,{xi,yi},x);
  21. f1=diff(f);
  22. f1=solve(f1);
  23. if f1~=0
  24. ai=double(f1);
  25. else
  26. break
  27. x,f=subs(f,{xi,yi},x),count
  28. end
  29. x=subs(x,a,ai);
  30. f=xi^2-xi*yi+3*yi^2;
  31. fxi=diff(f,xi);
  32. fyi=diff(f,yi);
  33. fxi=subs(fxi,{xi,yi},x);
  34. fyi=subs(fyi,{xi,yi},x);
  35. fii=[fxi,fyi];
  36. d=(fxi^2+fyi^2)/(fx^2+fy^2);
  37. s1=-fii+d*s;
  38. count=count+1;
  39. fx=fxi;
  40. fy=fyi;
  41. end
  42. x,f=subs(f,{xi,yi},x),count
复制代码


本程序由tammy友情提供
回复
分享到:

使用道具 举报

发表于 2006-10-15 23:40 | 显示全部楼层
这段代码是我编的吧,函数名称命名风格一看就是自己...^_^
当时刚学没几天,代码里大段大段的都是符号工具箱里的函数,运行慢得要死要活。
怎么给传出来的?好像从来没有发过的啊(because this code is sucks!!),迷惑...

[ 本帖最后由 bainhome 于 2006-10-16 00:32 编辑 ]
 楼主| 发表于 2006-10-20 15:06 | 显示全部楼层
原帖由 bainhome 于 2006-10-15 23:40 发表
这段代码是我编的吧,函数名称命名风格一看就是自己...^_^
当时刚学没几天,代码里大段大段的都是符号工具箱里的函数,运行慢得要死要活。
怎么给传出来的?好像从来没有发过的啊(because this code is sucks! ...



不知道怎么传出来的,好坏没关系,大家共同探讨嘛
发表于 2006-11-11 21:23 | 显示全部楼层
不能运行
发表于 2006-11-11 23:14 | 显示全部楼层

楼主 帮忙给编一个

正定二次函数(至少是4元函数);一个非二次函数(至少是5元函数)。

谢谢诶
发表于 2006-11-12 01:05 | 显示全部楼层
不能运行

I said this programm sucks,but that didn't means it can't run,base on what makes you say that???
  1. >> conjugate_grad_2d([2,2],0.05)
  2. x =
  3.      0     0
  4. f =
  5.      0
  6. count =
  7.      2
复制代码
 楼主| 发表于 2006-11-13 10:26 | 显示全部楼层
原帖由 coldspring 于 2006-11-11 21:23 发表
不能运行


可能是matlab版本问题,把错误信息贴出来
发表于 2006-11-20 12:00 | 显示全部楼层
不能运行


The expression to the left of the equals sign is not a valid target for an assignment

[ 本帖最后由 coldspring 于 2006-11-20 12:01 编辑 ]
发表于 2006-11-21 14:59 | 显示全部楼层
偶也试了,确实不能运行。。。
 楼主| 发表于 2006-11-22 10:16 | 显示全部楼层
程序没什么问题,是你们使用的问题
发表于 2006-11-22 15:06 | 显示全部楼层
sign...说几句重一点儿的话:
脖子上面大家都是一个脑子,为什么那么多的人想吃现成饭...最简单最基本的程序调试工作都不愿意做,顺手牵羊从网上弄来的程序就要求必须能完全嵌套在自己的问题里运行,可能吗?
还有,这个共轭梯度法的程序我当时是编写用于教学演示的,并没有考虑速度和通用性的方面,所以从使用角度而言,作为作者本人,我自己的评价是——代码垃圾!
但是这并不代表程序不能运行,我刚才看了看网上贴的这个版本和我自己原来存储的版本,除一处不同之外所有地方都一样,英文出错信息写得那么清楚,居然不愿意自己去调试!
把第一行的:
  1. function g=conjugate_grad_2d(x0,t)
复制代码

改成:
  1. function f=conjugate_grad_2d(x0,t)
复制代码

动一个字母,一切ok!有发帖子敲字的时间,这种问题早解决800遍了,这两天看coldspring到处发贴求类似的优化源程序,一个电影的名字,最能表达我的感想:《一声叹息》...
个人感觉像这种问题自己翻书早就编出来了,而且肯定要比我写的这个好,因为当时我写这个程序也就学了一两个月MATLAB而已。你当然会写的更好,与其看我的代码垃圾,不如写你自己的原创精品!坦白地说,这也是我不大愿意在振动的MATLAB版发贴的原因(别的板块我不太清楚也没发言权):不动脑子问问题的人太多,真正讨论问题的人太少,看着每天帖子一把抓热闹得了不得,动辄数目100以上简直花团锦簇。恕我直言:半数都是半途而废不了了之的垃圾和重复的网络授课。这个毛病不改,振动屯再多的资料,档次还是上不去!
话说得有点儿重,版主如果觉得不对,请删除,谢谢!

评分

1

查看全部评分

 楼主| 发表于 2006-11-25 11:08 | 显示全部楼层
原帖由 bainhome 于 2006-11-22 15:06 发表
sign...说几句重一点儿的话:
脖子上面大家都是一个脑子,为什么那么多的人想吃现成饭...最简单最基本的程序调试工作都不愿意做,顺手牵羊从网上弄来的程序就要求必须能完全嵌套在自己的问题里运行,可能吗?
还 ...


很同意bainhome的观点
不过话说回来你所说的现象不仅仅是某一个地方的问题,目前中国学术界普遍存在这样的问题
过于浮躁,什么都想要现成的!

遍地都是研究生?但是真会研究的又有几个人?别说研究了就算自己会考虑问题的吧,也不多!
我们老师曾经比较有感概的说过,就能力而言现在的研究生不如五六年前的本科生
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-12 14:50 , Processed in 0.076612 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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