参考以下程序。令x1,x2和λ分别在区间[1,11],[12,13],[-43,-42]中遍历,取最优解为函数f+λh对x1,x2,λ偏导值之和最小的那组解。这些遍历区间是通过手算得到大概的解区间确定的,如果扩大这个区间就使得程序运行时间成倍增长。改进办法是,先取较大的三个区间,比如[-10,10],[-10,10],[-10,10],每次只加01,取出满足条件的最优解,再根据最优解确定新的区间,每次只加001,如此反复直至取到较优的解。。。以下程序没有实现改进的方法,不过可供参考。
#include <stdioh>
double thres = 0001;
double f(double a, double b, double c) {
return 4 a a + 5 b b + 2 a c + 3 b c - 6 c;
}
double abs(double x) {
return x > 0 x : -x;
}
double fp(double a, double b, double c, int n) {
if (n == 1) return abs((f(a+thres,b,c)-f(a,b,c))/(thres));
if (n == 2) return abs((f(a,b+thres,c)-f(a,b,c))/(thres));
if (n == 3) return abs((f(a,b,c+thres)-f(a,b,c))/(thres));
}
int main()
{
double min = 1;
double a1 = 0, a2 = 0, a3 = 0;
for (double a = 1; a < 11; a += 0001)
for (double b = 12; b < 13; b += 0001)
for (double c = -43; c < -42; c += 0001){
double d = fp(a,b,c,1)+fp(a,b,c,2)+fp(a,b,c,3);
if (d < min) {
min = d;
a1 = a;
a2 = b;
a3 = c;
}
}
printf("%1f %1f\n",a1,a2);
return 0;
}
可以自己定义一个函数,然后放到那堆函数里边,以后调用的时候就方便了。我这就有一个当时从网上down的,改了一下。功能:输入一个数组,返回极大值和极小值的位置。
% my_extremumm
% This function is written for pick up the extremum ;
% -----------------------INPUT-----------------------
% x: the input series;
% -----------------------OUTPUT-----------------------
% indmin: the index of extre min extremum
% indmin: the index of extre max extremum
function [indmin,indmax]=my_extremum(x)
d=diff(x);
n=length(d);
d1=d(1:n-1);
d2=d(2:n);
indmin=find(d1d2<0 & d1<0)+1;
indmax=find(d1d2<0 & d1>0)+1;
你自己验证一下试试吧,应该是对的。
不能用是因为sym不支持max,y不是一系列的离散点 找极值有三种方法: 导数为0求极值、优化算法(运用函数)、绘图观察 其中有2个函数:(都是找极小值的函数,极大值可以用其相反数查找) [x,feal,exitflag,output]=fminbnd(fun,x1,x2,options)
在确定了约束函数后,可以在matlab中进行编写求极值程序。
fun=@(x)------ %输入函数表达式
x0=[]; %附函数初值lb=[]; %约束下界 ub=[]; %约束上界options=optimset('MaxFunEvals','1000','Algorithm','SQP');% 设置求解最大次数及算法,往往对于复杂函数表达式,默认的算法不能求解出来!
硬币向上定义为1,向下定义为0
#include<iostreamh>
#include<stdlibh>
#define N 100
void main()
{
srand(unsigned(time(NULL)));
int a[N],s=0,t=0;
for(int i=0;i<N;i++)
{a[i]=1;
}
for(i=0;i<N;i++)
{
s=s+a[i];
}
int m;
do
{ t++;
m=rand()%N;
a[m]=0;
}while(s);
cout<<t<<endl;
}
以上就是关于用拉格朗日乘子法求极值坐标点 用c语言编写程序全部的内容,包括:用拉格朗日乘子法求极值坐标点 用c语言编写程序、Matlab程序问题~判断极值的~、如何用rclimdex程序进行极值分析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)