进退法和黄金分割法c语言程序,黄金分割法与进退法的C语言程序.doc

介绍了一种使用一维搜索法寻找函数极小值的方法。该方法首先选取一个初始点和步长,通过比较不同点处的函数值来调整搜索方向和范围,逐步逼近函数的极小值点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思想:

对f(x)任选一个初始点a1及初始步长h, 通过比较这两点函数值的大小,确定第三点位置,比较这三点的函数值大小,确定是否为 “高—低—高” 形态。

(1)选定初始点a, 初始步长h=h0,计算 y1=f(a1),

y2=f(a1+h)。

(2)比较y1和y2。

(a)如y1>y2, 向右前进;加大步长 h=2 h ,转(3)向前;

(b)如y1

值互换。转(3)向后探测;

(c)如y1=y2,极小点在a1和a1+h之间。

(3)产生新的探测点a3=a1+h,y3=f(a3);

(4) 比较函数值 y2与y3:

(b)如y2>y3, 加大步长 h=2 h ,a1=a2,

a2=a3,转(3)继续探测。

(a)如y2

a=min[a1,a3], b=max[a3,a1],函数最小值所在的区间为[a, b] 。

我编的修改

#include

#include

#define f(x) 3*x*x*x-4*x+2

main()

{ double f1,f2,f3,temp,x1,x2,x3,h,a,b,Y1,Y2,A,A1,A2,e=0.2;

int n;

printf("x1=");

scanf("%lf",&x1);

printf("h=");

scanf("%lf",&h);

f1=f(x1);

x2=x1+h;

f2=f(x2);

if(f1==f2)

a=x1

b=x1>(x1+h)?x1:x1+h;

if(f2>f1)

{ h=-h;

temp=x1; x1=x2; x2=temp;

temp=f1; f1=f2; f2=temp;

x3=x2+h;

f3=f(x3);

}

else if(f2

{ h=2*h;

x3=x2+h;

f3=f(x3);

}

while(f2>f3)

{ x1=x2;

x2=x3;

f2=f(x3);

x3=x2+h;

f3=f(x3);

}

a=x1

b=x1>x3?x1:x3;

printf("[%f,%f]\n",a,b);

A1=b+0.328*(b-a); Y1=f(A1);

A2=a+0.618*(b-a); Y2=f(A2);

do {

n++;

if (!(Y1

{

a=A1;

A1=A2;

Y1=Y2;

A2=a+0.618*(b-a);

Y2=f(A2);

}

else

{

b=A2;

A2=A1;

Y2=Y1;

A1=b+0.382*(b-a);

Y1=f(A1);

}

} while ((a-b)>=e||(a-b)<=-e);

A=(a+b)*0.5;

printf("A = %lf\n",A);

printf("f(A) = %lf\n", f(A));

printf("n = %d\n",n);

printf("a=%f,b=%f",a,b);

getch();

}

陈文斌

#include

double m,n,p,e,a,b;

double F(double x)

{

return m*x*x+n*x+p;

}

InputData() //数据输入函数的名称要和倒数第四行的一起改,要同时改成同一名称

{

printf("x,y,z=?"); //这里提示输入方程的系数,提示语句x,y,z=?改成你自己的

scanf("%lf,%lf,%lf",&m,&n,&p);

printf("e=?"); //这里提示输入黄金分割的精度,提示语句e=?改成你自己的

scanf("%lf",&e);

}

JTF() //

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值