首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >最优化-求解多元函数的最优解源码C

最优化-求解多元函数的最优解源码C

作者头像
用户6948990
发布2025-04-03 21:00:30
发布2025-04-03 21:00:30
9100
代码可运行
举报
文章被收录于专栏:wuterwuter
运行总次数:0
代码可运行

文档中写到的代码均在win7/win10 VC++6.0下调试通过。(毕业前机房没有Visual C++2010)

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
double det=0.0001;         
double ak=0.003;              
double f(double *x)                  
{ 
 double y; 
 y=x[0]*x[0]+2*x[1]*x[1]-4*x[0]-2*x[0]*x[1]; 
 return y; 
 } 
void fun(double *x_k1,double *x_k,double *s_k,double a,int n)      
{ 
    int i; 
 for(i=0;i<n;i++) 
  x_k1[i]=x_k[i]+a*s_k[i]; 
} 
 void Get_Search_area(int n,double *x_k,double *s_k,double *a1,double *a3) 
{                                                                    
 double a=ak,s,f0,a2=0; 
 double f1=0,f2=0,f3=0; 
 double *x_k1; 
 x_k1=(double*)malloc(n*sizeof(double)); 
 f2=f(x_k); 
 while(1) 
 { 
  *a1=a2+a; 
  fun(x_k1,x_k,s_k,*a1,n); 
     f1=f(x_k1); 
     if(f1>f2) 
  { 
   if(a==ak) 
   { 
    *a3=*a1; 
    f3=f1; 
    a=-a; 
    continue; 
   } 
   else if(*a1>*a3) 
    { 
     s=*a1; 
     *a1=*a3; 
     *a3=s; 
     f0=f1; 
     f1=f3; 
     f3=f0; 
     break; 
    } 
   else break; 
  } 
  else  
  { 
   *a3=a2; 
   a2=*a1; 
   f3=f2; 
   f2=f1; 
   a=2*a; 
   continue; 
  } 
 } 
}  
void Gold_division(int n,double a1,double a4,double *x_k,double *s_k) 
{ 
 double a2,a3,f2,f3,a_star; 
 double *x_k2,*x_k3; int i; 
 x_k2=(double*)malloc(n*sizeof(double)); 
 x_k3=(double*)malloc(n*sizeof(double));  
 for(i=0;i<n;i++) 
 { 
  x_k2[i]=0; 
  x_k3[i]=0; 
 } 
 a2=a1+0.382*(a4-a1); 
 fun(x_k2,x_k,s_k,a2,n); 
 f2=f(x_k2); 
 a3=a1+0.618*(a4-a1); 
 fun(x_k3,x_k,s_k,a3,n); 
 f3=f(x_k3);  
 do 
 { 
  if(f2<=f3) 
  { 
   a4=a3; 
   a3=a2; 
   f3=f2; 
   a2=a1+0.382*(a4-a1); 
   fun(x_k2,x_k,s_k,a2,n); 
   f2=f(x_k2);
  } 
  else 
  { 
   a1=a2; 
   a2=a3; 
   f2=f3; 
   a3=a1+0.618*(a4-a1); 
         fun(x_k3,x_k,s_k,a3,n); 
   f3=f(x_k3); 
  } 
 } while(fabs(a4-a1)>det);  
  a_star=(a1+a4)*0.5; 
  fun(x_k,x_k,s_k,a_star,n); 
 free(x_k2); 
 free(x_k3); 
} 
void lunhuan(int n,double *x_k,double *f0) 
{ 
 double sum; 
 double *a_star=0,*f_star=0,*x0; 
 double **s_k; 
    double a1=0,a3=0; 
 double *a_1,*a_3; 
 int i,j; 
 a_1=&a1; 
 a_3=&a3; 
 x0=(double*)malloc(n* sizeof(double)); 
 s_k=(double**)malloc(n*sizeof(double*)); 
 for(i=0;i<n;i++) 
 { 
  s_k[i]=(double*)malloc(n* sizeof(double)); 
  for(j=0;j<n;j++) 
   if(i==j) 
    s_k[i][j]=1; 
   else 
    s_k[i][j]=0; 
 } 
 while(1) 
 { 
  for(i=0;i<n;i++) 
   x0[i]=x_k[i];  
  for(i=0;i<n;i++)  
  { 
   Get_Search_area(n,x_k,s_k[i],a_1,a_3);  
      Gold_division(n,*a_1,*a_3,x_k,s_k[i]); 
  } 
  sum=0; 
  for(i=0;i<n;i++) 
   sum+=(x0[i]-x_k[i])*(x0[i]-x_k[i]); 
  if(sqrt(sum)<=det) 
   break; 
 } 
 *f0=f(x_k); 
 free(x0); 
 for(i=0;i<n;i++) 
 { 
  free(s_k[i]); 
 } 
 free(s_k); 
}  
int main() 
{ 
 double *x_k,*f; 
 double f0=0;
 int n=2,i; 
 f=&f0; 
 puts("原函数为f=(x[0]-2)*(x[0]-2)+(x[1]-3)*(x[1]-3);\n"); 
 x_k=(double*)malloc(n*sizeof(double)); 
 printf("输入起始坐标x_k:\n"); 
 for(i=0;i<n;i++) 
  scanf("%lf",&x_k[i]); 
  lunhuan(n,x_k,f); 
 puts("函数极小点坐标:\n"); 
 for(i=0;i<n;i++) 
  printf("%lf;",x_k[i]); 
 printf("\n"); 
 puts("函数最小值:\n"); 
 printf("%lf\n",*f); 
 free(x_k); 
 return 0; 
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档