Igorr
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору IgVEp Цитата: Мне нужно не само решение, а ссылка на описание решения | Поскольку у форумчан видимо не оказалось нужной ссылки под рукой, то могу предложить своё [возможное] описание решения (может пригодится). Из условия задачи следует, что у вас/нас нет привязки направляющих косинусов лучей к ВФ - значит аппарат урматов с градиентом функции мы использовать не можем. Тогда только элементарная математика. Итак, найдём OPD лучей в соответствии с условиями задачи. Считаем, что лучи распространяются в среде с n = 1 и заданная поверхность с известными направляющими косинусами лучей и координатами их пересечения с ней находится в такой же среде (n = 1). Для начала определим поверхность ВФ. Т.к. у нас нет аналитических зависимостей, то поверхность ВФ можем задать в любом желаемом виде. Пусть это будет искажённая сферическая поверхность: Код: z = W(x,y) == sqrt(D**2 - (x-A)**2 - (y-B)**2) + C // сферическая часть + E*x**2 + F*x*y + G*y**2 + H*x**3*y + ... // искажение | т.е. имеем 8 неизвестных: A,B,C,D,E,F,G,H (... не считаем). Рассмотрим один луч: его направляющие косинусы cx,cy,cz и координаты X,Y,Z пересечения с заданной поверхностью в некоторой СК известны; его уравнение: Код: (x-X)/cx = (y-Y)/cy = (z-Z)/cz = t | т.е. имеем параметрическое описание прямого луча: Код: (1): x = cx*t + X y = cy*t + Y z = cz*t + Z | Далее: т.к. направляющие косинусы луча соответствуют направляющим косинусам нормали к поверхности ВФ в некоторой (неизвестной) его точке, то: Код: (2): cx = f(x,y)/sqrt(f(x,y)**2 + g(x,y)**2 + 1) == Cx(x,y) cy = g(x,y)/sqrt(f(x,y)**2 + g(x,y)**2 + 1) == Cy(x,y) cz = 1/sqrt(f(x,y)**2 + g(x,y)**2 + 1) == Cz(x,y) | где f(x,y) и g(x,y) - частные производные функции Код: (3): Ф(x,y,z) == z - W(x,y) = 0 | по x и y соответственно. Подставив значения x,y,z из (1) в (3) и (2), и считая неизвестными t и коэффициенты в W(x,y), получаем систему 4-х ур-ий с 8+1 неизвестными: Код: (4): Ф(A,B,C,D,E,F,G,H, t) = 0 cx = Cx(A,B,C,D,E,F,G,H, t) cy = Cy(A,B,C,D,E,F,G,H, t) cz = Cz(A,B,C,D,E,F,G,H, t) | т.е. каждый луч даёт 4 ур-ия и добавляет 1 неизвестную - свою t. Таким образом, 3 луча дают 3*4=12 ур-ий, а мы имеем 8+3*1=11 неизвестных, т.е. можем добавить ещё один член в W(x,y), напр. I*x**2*y**2. Решив полученную систему 12-и ур-ий (4), имеем ур-ие ВФ (которое само по себе в данной задаче и не нужно) и t для 3-х лучей - t1, t2, t3. Ну а вычислить теперь OPD не составляет труда: очевидно, что OPD двух лучей на заданной поверхности = ti - tj. Теперь вопрос: сколько нужно лучей для расчёта с заданной точностью? Интересно. Напр. имеем 10 лучей. Они дают 10*4=40 ур-ий и 10 своих t, т.е. можем найти 40-10=30 коэффициентов в W(x,y) или в любом другом представлении формы поверхности ВФ. Много это или мало? Чтобы это понять, можно, напр. поступить так: решаем полученную систему 40-а ур-ий (4) для 2-х (3-х или N) разных наборов из 10 лучей. Если соответствующие коэффициенты в W(x,y) будут равными в переделах заданной точности, то значит этого достаточно [и их количество можно даже попробовать уменьшить]. Если же нет, то увеличивать число лучей. Про n: Если лучи до и после заданной поверхности распространяются в среде с n = const > 1, то очевидно, что ничего принципиально не меняется - добавляется лишь множитель в OPD. Если заданная поверхность разделяет среды с разными n = const или является зеркалом, то учитываем преломление / отражение на границе двух сред для направляющих косинусов лучей. Если же n == n(x,y,z) <> const, то задача чуть усложняется - в систему ур-ий (4) надо добавить ур-ия кривых лучей (напр. в параметрическом виде по типу (1) с соответствующей нелинейной зависимостью по t), и скорректировать ур-ия (2) с учётом кривого пути лучей. |