IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Расстояние между точками
RIDDICK
сообщение 1.03.2005 1:34
Сообщение #1


Гость






Помогите пожалуйста решить задачку:

На плоскости расположено 10 точек, которые заданы своими координатами. Найти на оси абсцисс точку, наибольшее из расстояний от которой до выбранных точек было бы минимальным.

Надеюсь на вас, "акулы форума"
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
hiv
сообщение 1.03.2005 13:43
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Вот решение задачи. Эта задача на оптимизацию. Есть некая функция F(X) - нужно найти ее минимум. Берем из нее производную по X и, приравнивая ее к нулю, получаем оптимальное значение X, т.е. F'(Xmin)=0
Это уравнение решаем любым численным методом - в данном случае "метод простых итераций".

Код
program TCHK;
uses crt;

const count=10;        {количество точек}
     epsilon=1E-6;    {точность вычислений}

type TRPoint = record
      X,Y :extended;
    end;

{ в массиве P задаем координаты точек}
const P :array [1..count] of TRPoint =(
(X: 2.5; Y: 2.0),
(X: 3.0; Y:-3.0),
(X: 3.5; Y: 4.0),
(X: 4.0; Y: 1.0),
(X: 4.5; Y:-4.0),
(X: 5.0; Y:-2.0),
(X: 5.5; Y: 5.0),
(X: 6.0; Y: 7.0),
(X: 6.5; Y:-9.0),
(X: 7.0; Y: 1.0)
);

var i :integer;
   x,x0,M :extended;

function SummaRast(x:extended):extended; {подсчет суммы расстояний от точки X до всех остальных точек}
var  i :integer;
    s :extended;
begin
 s:=0;
 for i:=1 to count do s:=s+sqrt(P[i].Y*P[i].Y+(x-P[i].X)*(x-P[i].X));
 SummaRast:=s;
end;

function MinFunc(x:extended):extended; {производная функции суммы расстояний}
var  i :integer;
    s :extended;
begin
 s:=0;
 for i:=1 to count do s:=s+(x-P[i].X)/sqrt(P[i].Y*P[i].Y+(x-P[i].X)*(x-P[i].X));
 MinFunc:=s;
end;

begin {основная программа}
 clrscr;

 x0:=0;
 for i:=1 to count do x0:=x0+P[i].X;
 x:=x0/count; {среднее значение координат точек по оси абсцисс}
 writeln('Начальное приближение x=',x);

 M:=-(MinFunc(x+epsilon)-MinFunc(x))/epsilon; {коэффициент для улучшения сходимости}

 i:=0;
 repeat
   x0:=x;
   x:=x0+MinFunc(x0)/M; {метод простых итераций}
   inc(i);
   writeln('Итерация ',i:0,'---------------------------');
   writeln('x=',x,' точность=',abs(x-x0));
   writeln('MinFunc=',MinFunc(x),' SummaRast=',SummaRast(x));
 until (abs(x-x0)<epsilon)or(i>100);

 if (abs(x-x0)<epsilon) then writeln('Ответ: X=',x)
 else writeln('Ответ не найден! За 100 шагов итерация не сошлась.');

end.


Пробуйте... smile.gif


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.07.2025 21:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"