Консультация № 173320
16.10.2009, 09:23
0.00 руб.
0 9 1
Доброго времени суток, уважаемые эксперты.
Вот и мне понадобилась срочная помощь. Дочери задали задачку:
Вычислить значение функции U = *
при 1<=x=<3, hx=1.3 , 2<=y<=1.3, 0.5<=Z=<1.5, hz=0.8
Найти минимальное значение U среди всех удовлетворяющих условию U>2.1 и при каких x, y, z они достигаются.
Тема - "Циклы". Рисунок функции [url= https://rfpro.ru/upload/856]тут.[/url]

Заранее спасибо за решение.

Обсуждение

Неизвестный
16.10.2009, 09:43
общий
Sel:
Доброе утро!
Если я правильно понял, то hx, hz - шаг перебора аргументов функции U по x и z соответственно. Если это - так, то в условии не хватает hy. Если - не так, то что значат эти параметры в условии.
давно
Посетитель
7438
7205
16.10.2009, 09:46
общий
Привет
Так понимаю, hx, hz - шаг по x, z. Мало значений получается, так и надо?
А где hy (шаг по y)?
Не кажется странным 2<=y<=1.3 ?

Под какой С надо делать? Или не важно?
Надо ли делать вывод на экран?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.10.2009, 15:00
общий
hy=1.3
Программа должна быть на С++.
Да, вывод на экран нужен.
давно
Академик
320937
2216
16.10.2009, 15:07
общий
16.10.2009, 16:28
это ответ
Здравствуйте, Sel.

Предположения.
1. В задании границ участков, величины шага есть ошибки (так нередко бывает, если используется таблица вариантов заданий), поэтому предусмотрен "ручной ввод".
2. Используется C++ (т.е. iostream,cin,cout);
3. Считаются известными for, if, математические функции, DBL_MAX.
4. Ошибки деления на ноль и отрицательного игрек не обрабатываются
Текст программы в приложении

Приложение:
#include <iostream>
#include <cfloat> // макроопределение DBL_MAX
#include <cmath> // прототипы математических функций

using namespace std;
int main()
{
double border = 2.1; // дополнительное условие
double x1, x2; // границы интервалов
double y1, y2;
double z1, z2;
double hx, hy, hz; // шаги

double x,y,z;
double xmin, ymin, zmin;
double u; // текущее значение функции
double umin;

cout << "x1=";
cin >> x1;

cout << "x2=";
cin >> x2;

cout << "hx=";
cin >> hx;

cout << "y1=";
cin >> y1;

cout << "y2=";
cin >> y2;

cout << "hy=";
cin >> hy;

cout << "z1=";
cin >> z1;

cout << "z2=";
cin >> z2;

cout << "hz=";
cin >> hz;

cout << "border=";
cin >> border;

umin = DBL_MAX; // пусть для начала umin равно очень большому числу,
// тогда любое получившееся в результате расчета число будет
// заведомо меньше этого
// если все-таки в конце umin остался равным DBL_MAX, интервалы
// заданы неверно
xmin = ymin = zmin = DBL_MAX;

for (x=x1; x<=x2; x+=hx)
{
for (y=y1; y<=y2; y+=hy)
{
for (z=z1; z<=z2; z+=hz)
{
u= -sqrt(y*y+4*x*x/3)+log(y)/fabs(x*z);
if ((u>border) && (u<umin))
{
xmin = x;
ymin = y;
zmin = z;
umin = u;
}
}
}
}
if (umin==DBL_MAX)
cout << "Net trebuemogo reshenia" << endl;
else
cout << "MINU(" << xmin << "," << ymin << "," << zmin << ") = " << umin << endl;

return 0;
}
5
Большое спасибо за помощь в решении вопроса, который для нас был неразрешим! :)
давно
Посетитель
7438
7205
16.10.2009, 15:48
общий
Пара замечаний:
Во-первых, в программе есть неточность: abs - целочисленная функция, для вещественных чисел надо писать fabs
Во-вторых, функция для всех значений всегда < 0, и никогда не выполнится U>2.1
Что-то не так в условии...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.10.2009, 16:11
общий
Лысков Игорь Витальевич:
Спасибо за замечание. Можно ли внести изменение в ответ, то есть внести fabs вместо abs и ввод с консоли границы 2.1 ?
Текст прилагается.

#include <iostream>
#include <cfloat> // макроопределение DBL_MAX
#include <cmath> // прототипы математических функций

using namespace std;
int main()
{
double border = 2.1; // дополнительное условие
double x1, x2; // границы интервалов
double y1, y2;
double z1, z2;
double hx, hy, hz; // шаги

double x,y,z;
double xmin, ymin, zmin;
double u; // текущее значение функции
double umin;

cout << "x1=";
cin >> x1;

cout << "x2=";
cin >> x2;

cout << "hx=";
cin >> hx;

cout << "y1=";
cin >> y1;

cout << "y2=";
cin >> y2;

cout << "hy=";
cin >> hy;

cout << "z1=";
cin >> z1;

cout << "z2=";
cin >> z2;

cout << "hz=";
cin >> hz;

cout << "border=";
cin >> border;

umin = DBL_MAX; // пусть для начала umin равно очень большому числу,
// тогда любое получившееся в результате расчета число будет
// заведомо меньше этого
// если все-таки в конце umin остался равным DBL_MAX, интервалы
// заданы неверно
xmin = ymin = zmin = DBL_MAX;

for (x=x1; x<=x2; x+=hx)
{
for (y=y1; y<=y2; y+=hy)
{
for (z=z1; z<=z2; z+=hz)
{
u= -sqrt(y*y+4*x*x/3)+log(y)/fabs(x*z);
if ((u>border) && (u<umin))
{
xmin = x;
ymin = y;
zmin = z;
umin = u;
}
}
}
}
if (umin==DBL_MAX)
cout << "Net trebuemogo reshenia" << endl;
else
cout << "MINU(" << xmin << "," << ymin << "," << zmin << ") = " << umin << endl;

return 0;
}
давно
Посетитель
7438
7205
16.10.2009, 16:26
общий
leonid59:
Легко
И вводить надо border = -3.0
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.10.2009, 16:39
общий
Лысков Игорь Витальевич:
Спасибо! Сегодня явно не мой день (после qbasica) :)
Неизвестный
17.10.2009, 14:13
общий
Спасибо большое всем, кто принял участие в поиске решения на мой вопрос. :)
Форма ответа