c语言试探法求函数最优解 对数函数求解方法

已知目标函数f(x)=x +20/x,取初始区间[a,b]=[2,10],用0.618法求最优解

这里是求目标函数的极小值对应的x值吧?理论分析可知,x = 2√5 ≈ 4.472136 。直接看代码:

郴州ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!

#include stdio.h

#include conio.h

double x618(double x1,double x2){ //求x1,x2之间靠近x1的黄金分割点

return x1*0.618+x2*0.382;

}

double f(double x){ //目标函数

return x+20.0/x;

}

int main(){

double x1=2.0,x2=10.0,xt1,xt2,ft1,ft2,x;

int cnt=0;

xt1=x618(x1,x2);

xt2=x618(x2,x1);//得到初始试探点,xt1靠近x1,xt2靠近x2

while(x2-x11e-6){//这里假设精度达到0.001即退出

++cnt;//统计迭代次数

ft1=f(xt1);

ft2=f(xt2);

if(ft1ft2){//这里要找极小值,所以要保留小的,如果要找极大值,只需把""改成""

x2=xt2; xt2=xt1; xt1=x618(x1,x2);

}else{

x1=xt1; xt1=xt2; xt2=x618(x2,x1);

}

}

x=(x1+x2)/2;

printf("x=%lg, f(x)=%lg, count=%d",x,f(x),cnt);

printf("\nFinished!\n");

getch();

return 0;

}

程序运行结果与理论解相符。

C语言最优解算法

#includestdio.h

int result[100][6];

int data[100000][2];

int main()

{

int i,j,T,f,temp,rlen=0,dlen,swap;

scanf("%d",T);

while(T--0)

{

for(dlen=0;1;dlen++)

{

scanf("%d %d",data[dlen][0],data[dlen][1]);

if(0==data[dlen][0] 0==data[dlen][1])

break;

}

scanf("%d",f);

for(i=0;idlen-1;i++)

{

for(j=0;jdlen-i-1;j++)

{

swap=0;

if(0==f)

{

if(data[j][0]data[j+1][0] || (data[j][0]==data[j+1][0] data[j][1]data[j+1][1]))

{

swap=1;

}

}

else if(1==f)

{

if(data[j][1]data[j+1][1] || (data[j][1]==data[j+1][1] data[j][0]data[j+1][0]))

{

swap=1;

}

}

if(1==swap)

{

temp=data[j][0];

data[j][0]=data[j+1][0];

data[j+1][0]=temp;

temp=data[j][1];

data[j][1]=data[j+1][1];

data[j+1][1]=temp;

}

}

}

if(dlen=3)

{

for(i=0;i3;i++)

{

result[rlen][2*i]=data[i][0];

result[rlen][2*i+1]=data[i][1];

}

rlen++;

}

}

for(i=0;irlen;i++)

{

printf("Case #%d:\n",i+1);

for(j=0;j3;j++)

printf("%d %d\n",result[i][2*j],result[i][2*j+1]);

}

return 0;

}

C语言编程用试探法(要求从大到小试探)实现函数gcd(m,n),其功能为求解正整数m、n的最大公约数。

#includestdio.h

void gcd(int m, int n) {

int temp = m, i, max;

if(temp  n) {

temp = n;

}

max = temp;

for(i=temp; i=1; i--) {

if(m%max==0  n%max==0) {

printf("The result is [%d]", max);

return;

}

max--;

}

}

int main() {

int M, N;

scanf("[%d],[%d]", M, N);

gcd(M, N);

return 0;

}

【C语言算法】求最优解

#include stdio.h

void main()

{

double V;

printf_s("请输入V:\n");

scanf_s("%lf", V);

int m, n, p;

int M, N, P;

double delta = 10000.0;

for(m = 0; m = 16; m++)

{

for(n = 0; n = 256; n++)

{

for(p = 1; p = 4096; p++)

{

double d = m*n/(double)p - V;

if(d  0)

d = -d;

if(d  delta)

{

delta = d;

M = m;

N = n;

P = p;

}

}

}

}

printf_s("最优解:M = %d, N = %d, P = %d\n", M, N, P);

}


分享标题:c语言试探法求函数最优解 对数函数求解方法
文章分享:http://scyanting.com/article/dooesco.html