以下代码的vs2019工程文件打包点此下载去掉运行部分的注释即可
/*powell.cpp*/
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include "Powell.h"
#include <iostream>
#define m 10 /*数组长度m >= 维数n */
float powell::powell_f(float x[])
{
float result;
//result = (x[0] - 2)*(x[0] - 2) + (x[1] - 3)*(x[1] - 3) + (x[2] - 4)*(x[2] - 4);
result = x[0] * x[0] + 2 * x[1] * x[1] - 2 * x[0] * x[1] - 4 * x[0];
return result;
}
/*多维进退法子程序*/
void powell::mjtf(int n, float x0[], float h, float s[], float a[], float b[])
{
int i;
float x1[m], x2[m], x3[m], powell_f1, powell_f2, powell_f3;
for (i = 0; i<n; i++) /*计算初始两试点*/
{
x1[i] = x0[i];
x2[i] = x0[i] + h*s[i];
}
powell_f1 = powell_f(x1);
powell_f2 = powell_f(x2);
if (powell_f2 >= powell_f1) /*判断搜索方向*/
{
/*搜索方向为反向,转身*/
h = (-1)*h;
for (i = 0; i<n; i++)
x3[i] = x1[i];
powell_f3 = powell_f1;
for (i = 0; i<n; i++)
x1[i] = x2[i];
powell_f1 = powell_f2;
for (i = 0; i<n; i++)
x2[i] = x3[i];
powell_f2 = powell_f3;
} /*搜索方向为正向*/
for (i = 0; i<n; i++) /*计算第三试点*/
x3[i] = x2[i] + h*s[i];
powell_f3 = powell_f(x3);
while (powell_f3<powell_f2) /*判断是否未完成搜索*/
{
/*未完成,继续搜索*/
h = 2 * h;
for (i = 0; i<n; i++)
x1[i] = x2[i];
powell_f1 = powell_f2;
for (i