Составить подпрограмму для поиска минимума функции
Составить подпрограмму определения минимума функции у = f(х), заданной в дискретных точках отрезка [а, b] с постоянным шагом h. Используя ее, найти минимумы функций: y1 = sin^2х * соsх – 1n|х| на отрезке [0.1; 1], h = 0.1; y2 = x^2- 2х + 8 на отрезке [-1; 1 ], h = 0.2.
#include <iostream>
#include <cmath>
using namespace std;
double first_y(double x);
double second_y(double x);
void main() {
setlocale(0, "");
double a1 = 0.1, b1 = 1, a2 = -1, b2 = 1, y1, y2, min1 = a1, min2 = a2, h1 = 0.1, h2 = 0.2;
cout << "Функция y = sin^2(x) * cos(x) - ln(|x|)\n";
cout << "Шаг: " << h1;
while (a1 <= b1){
y1= first_y(a1);
a1 += h1;
}
if (min1 >= y1) min1 = y1;
cout << "Минимальное первой функции: " << min1 << endl;
cout << "Функция y = x^2 - 2x + 8\n";
cout << "Шаг: " << h2;
while (a2 <= b2){
y2 = second_y(a2);
a2 += h2;
}
if (min2 >= y2) min2 = y2;
cout << "Минимальное второй функции: " << min2 << endl;
}
double first_y(double x) {
if (x == 0) return 0;
if (x!=0) return pow(sin(x), 2) * cos(x) - log(abs(x));
}
double second_y(double x) {
return pow(x, 2) - 2 * x + 8;
}
Ответы (1 шт):
Ну, у вас много несуразностей, типа void main()... Или вы пробегаете все значения, и только последнее сравниваете с минимальным
while (a1 <= b1){
y1= first_y(a1);
a1 += h1;
}
if (min1 >= y1) min1 = y1;
Да и само значение min1 у вас не значение функции, а минимальное значение ее аргумента. Словом, вы складываете 3 килограмма и 2 метра, и хотите получить 5 ампер...
Да, у меня (VC++ 2019) программа не ломается. Но, понятно, выдает неверные ответы.
Я бы ее переделал следующим образом:
#include <iostream>
#include <cmath>
using namespace std;
double first_y(double x);
double second_y(double x);
double get_min(double(*f)(double), double a, double b, double h)
{
double min = f(a);
for( ;a < b + h/2; a+=h)
{
double y = f(a);
if (min > y) min = y;
}
return min;
}
int main()
{
cout << "Функция y = sin^2(x) * cos(x) - ln(|x|)\n";
cout << "Минимальное значение: " << get_min(first_y,0.1,1,0.1) << "\n\n";
cout << "Функция y = x^2 - 2x + 8\n";
cout << "Минимальное значение: " << get_min(second_y,-1,1,0.2) << "\n\n";
}
double first_y(double x)
{
double y = cos(x);
return y*(1-y*y)-log(abs(x));
}
double second_y(double x)
{
return (x - 2) * x + 8;
}