声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3945|回复: 17

[编程技巧] [求助]真诚请教:0.618法的一维搜索

[复制链接]
发表于 2005-11-5 11:34 | 显示全部楼层 |阅读模式

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

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

x
这是MATLAB中的优化问题,用0.618法做,需要编个程序:
求min y(x)=(x*x-1)(x*x-1) 在区间 [0,2] 上的一个解,要求精度为10^(-1)。
由于在下是第一次遇到这样的问题,所以不怎么懂,还望各位前辈不吝指教!
谢谢!
回复
分享到:

使用道具 举报

发表于 2005-11-5 11:40 | 显示全部楼层
  1. #include
  2. #include
  3. /*黄金分割法求最小值的C++程序,部分变量及函数书写并不规范*/

  4. //δ为题给精度
  5. int n = (lnδ/ln0.618 + 1) + 1;
  6. int i;
  7. float f(float ai, float bi)
  8. {
  9. a(i + 1) = ai + 0.618(bi - ai);
  10. return ai + 1;
  11. }

  12. float g(float ai, float bi)
  13. {
  14. b(i + 1) = ai + 0.382(bi - ai);
  15. return b(i + 1);
  16. }

  17. float F(float ai, float bi)
  18. {
  19. //题给的f(x)函数式;
  20. return ;
  21. }

  22. float A(float ai, float bi)
  23. {
  24. int i = 1;
  25. float result;
  26. L:do
  27. {
  28. a(i + 1) = f(float ai, float bi);
  29. b(i + 1) = g(float ai, float bi);
  30. float F1 = F(float ai, float bi);
  31. float F2 = F(float a(i + 1), float b(i + 1));
  32. ai = ai, bi = b(i + 1);
  33. i ++;

  34. }while(i <= n && F1 >= F2)
  35. if(i < n)
  36. {
  37. B(float ai, float bi);
  38. }
  39. else
  40. result = F2;
  41. return result;

  42. }

  43. float B(float ai, float bi)
  44. {
  45. do
  46. {
  47. a(i + 1) = f(float ai, float bi);
  48. b(i + 1) = g(float ai, float bi);
  49. float F1 = F(float ai, float bi);
  50. float F2 = F(float a(i + 1), float b(i + 1));
  51. ai = a(i + 1), bi = bi;
  52. i ++;

  53. }while(i <= n && F1 <= F2)
  54. if(i < n)
  55. {
  56. goto L;
  57. }
  58. else
  59. result = F1;
  60. return result;

  61. }

  62. void main()
  63. {
  64. int i = 1;
  65. float A(float ai, float bi);
  66. cout<<"最小值为:"<}
复制代码


这是C语言写的,你改写一下就行了
发表于 2005-11-5 11:42 | 显示全部楼层
不用这么麻烦

matlab自带了函数的

用fminbnd就行了
 楼主| 发表于 2005-11-5 12:51 | 显示全部楼层
您好!
感谢您的解答,我会好好研究的。再请教一个问题,只在C++中编写完程序后再导入MATLAB吗?怎么操作比较好?因为我从来没有操作过类似的情况。
非常谢谢!
 楼主| 发表于 2005-11-5 12:54 | 显示全部楼层
您好!
请问您所指的命令该如何使用?这个命令本身就是用0.618法做的吗?还要不要添加别的程序?敢问您有没有现成的例子能让我学习一下的?
非常感谢!
发表于 2005-11-5 14:16 | 显示全部楼层
写一个fun1.m文件:
function f=fun1(x);
f=(x*x-1)*(x*x-1);

然后才命令窗口输入
[x,y]=fminbnd('fun1',0,2)  就行了
发表于 2005-11-5 14:19 | 显示全部楼层
二楼的不是这个意思
他的意思是讲C语言的程序翻译成matlab的代码
相当于是自己编程,只是有一个C语言程序作为参照
 楼主| 发表于 2005-11-5 14:39 | 显示全部楼层
您好!
谢谢您的解答,我会试一下的,若再有什么问题再来请教。
另外我想再请教一问:在优化中,是否各种探索法都对应有各自的命令,只要在使用时输入命令和参数就行?
非常感谢!You are my teacher!
 楼主| 发表于 2005-11-5 14:42 | 显示全部楼层
原来如此。看来我太孤陋寡闻了。
 楼主| 发表于 2005-11-5 14:47 | 显示全部楼层
您好!
对不起,又来打扰了,我刚才根据您的指导,把第一行的命令输入,打了回车后系统给了如下的提示:
function f=fun1(x);
??? Strings passed to EVAL cannot contain function declarations.

请教这句话是什么意思?
谢谢!
发表于 2005-11-5 15:04 | 显示全部楼层
请仔细看6楼,要先写一个.m文件
在命令窗口输入的是[x,y]=fminbnd('fun1',0,2)
发表于 2005-11-5 15:05 | 显示全部楼层
看你要用什么?用来做什么?

如果你真要用matlab建议先拿本matlab的书先看看,大致了解一下

很简单一般一两天就能初步掌握了
 楼主| 发表于 2005-11-5 15:20 | 显示全部楼层
您好!
谢谢!原来是这个意思,先新建一个M文件,然后再使用。我第一次玩这个东西,多多指教!
虽然您这样批评我感觉很受打击,但还是要谢谢您!
发表于 2005-11-5 15:25 | 显示全部楼层
没有批评的意思,只是给我的感觉你是刚刚用matlab
很多基本的东西书上都写得很详细了,所以建议你先看看书
有利于你使用matlab
发表于 2005-11-18 18:11 | 显示全部楼层
xiexie
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-25 12:55 , Processed in 0.067009 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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