用拉格朗日乘子法求极值坐标点 用c语言编写程序

用拉格朗日乘子法求极值坐标点 用c语言编写程序,第1张

参考以下程序。令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程序进行极值分析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10079826.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存