Encuentra el valor extremo usando la regla de los tercios.

El código se muestra a continuación.

//可以判断极小值

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

double f(double x, const vector<double>& data) {
	int n = data.size();
	int left = 0, right = n - 1;
	while (left + 1 < right) {
		int mid = left + (right - left) / 2;
		if (x < mid) right = mid;
		else left = mid;
	}
	double x1 = left;
	double x2 = right;
	double y1 = data[left];
	double y2 = data[right];
	return y1 + (y2 - y1) * (x - x1) / (x2 - x1);
}

double ternary_search(double left, double right, double eps, const vector<double>& data) {
	while (right - left > eps) {
		double mid1 = left + (right - left) / 3;
		double mid2 = right - (right - left) / 3;
		double f_mid1 = f(mid1, data);
		double f_mid2 = f(mid2, data);
		if (f_mid1 < f_mid2) {
			right = mid2;
		}
		else {
			left = mid1;
		}
	}
	return (left + right) / 2;
}

int main() {
	//vector<double> data = { 494.605, 459.84, 381.933, 321.128, 253.115, 213.087, 185.125, 167.345, 153.023, 141.001, 187.745, 223.045, 260.842, 344.141, 370.685 };

	vector<double> data = { 347.807, 364.69, 414.458, 459.168, 519.5, 552.838, 577.54, 587.161, 562.427, 523.519, 450.776, 425.747, 361.844, 333.258, 313.117 };

	double left = 0.0;
	double right = 14.0;
	double eps = 1e-9;

	double min_x = ternary_search(left, right, eps, data);

	cout << "min_x的值是" << "," << min_x << endl;

	double f_min_x = f(min_x, data);

	cout << "f_min_x的值是" << "," << f_min_x << endl;

	double f_left = f(left, data);
	double f_right = f(right, data);

	if (f_min_x < f_left && f_min_x < f_right) {
		cout << "函数是凹函数" << endl;
	}
	else if (f_min_x > f_left && f_min_x > f_right) {
		cout << "函数是凸函数" << endl;
	}
	else {
		cout << "函数不是凸函数也不是凹函数" << endl;
	}

	if (f_left < f_min_x && f_min_x < f_right) {
		cout << "函数是单调增的" << endl;
	}
	else if (f_left > f_min_x && f_min_x > f_right) {
		cout << "函数是单调减的" << endl;
	}
	else {
		cout << "函数不是单调增也不是单调减" << endl;
	}

	return 0;
}

Si se requiere un valor máximo, cambie f_mid1 < f_mid2 a f_mid1 > f_mid2

Pregunta 1: Si una columna de datos no sabe si es convexa o cóncava, ¿se puede utilizar el método de búsqueda de tres puntos para determinar si la columna de datos es convexa o cóncava?


El método de búsqueda ternaria se utiliza principalmente para buscar rápidamente en una función unimodal (un único punto extremo) para encontrar la ubicación del punto extremo. En este caso, es muy eficiente. Sin embargo, el método de búsqueda de tres puntos no se puede utilizar para determinar si una columna de datos es una función convexa o cóncava.

Tanto las funciones convexas como las cóncavas tienen definiciones y propiedades específicas que difieren de la naturaleza unimodal de la función. Una función se llama función convexa si el valor de la función en la recta que conecta dos puntos cualesquiera en su dominio no es menor que el valor de la función en los dos puntos finales de la recta. Por el contrario, una función se llama función cóncava si el valor de la función en la línea que conecta dos puntos cualesquiera en su dominio no es mayor que el valor de la función en los dos puntos finales de la línea.

Determinar si una columna de datos es una función convexa o cóncava requiere un análisis basado en la definición y las propiedades de la función. El método de búsqueda de tres puntos no es adecuado para este problema. Es necesario analizar la tendencia de cambio de la función, verificar el cambio de su pendiente y el signo de la segunda derivada para determinar la naturaleza convexa y cóncava de la función.

Con todo, el método de búsqueda de tres puntos es adecuado para encontrar los puntos extremos de una función unimodal, pero no para determinar si una columna de datos es una función convexa o cóncava. La determinación de las propiedades convexas y cóncavas requiere un análisis más profundo y una derivación matemática.

Pregunta 2: El método de búsqueda de tres puntos es adecuado para encontrar puntos extremos en funciones continuas, pero para puntos de datos discretos, generalmente se analiza con la ayuda de gráficos y observaciones.

Enlace de referencia 1: búsqueda ternaria y sus ejemplos_blog de LittleMagics-blog de CSDN

Enlace de referencia 2: Verificación de seguridad de Baidu

Supongo que te gusta

Origin blog.csdn.net/pingchangxin_6/article/details/132099311
Recomendado
Clasificación