2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 как проинтегрировать функцию в среде Mathematica
Сообщение14.03.2012, 17:39 


14/03/12
52
Всем привет!
У меня следующая задача. У меня есть массив точек, которые я импортировал в "Mathematica", т.е. набор "n" точек с координатами (x,y,z). Т.е. {z0,z1,z2,...zn} - значения некой функции f(x,y) в точках {x0,x1,x2,...,xn},{y0,y1,y2,...yn}.
Массив представляет собой результат 2D моделирования электромагнитного поля. Получается некая фигура неопределенной формы. Расстояние между точками меняется, т.е. сетка при моделировании у меня была неравномерная.
Мне необходимо проинтегрировать эту функцию по всему объему в среде "Mathematica".
Как это можно было бы сделать, учитывая неравномерность сетки?
Заранее благодарен за любые комментарии по теме.

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение15.03.2012, 12:25 


14/03/12
52
поясняю, что сетка была треугольной формы

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение15.03.2012, 20:01 
Заслуженный участник


25/02/11
1797
Есть ли возможность как-то определить область? Чтобы было можно говорить об интеграле по области. В пакете математика есть какие-то функции, интерполирующие данные. Если как-то в виде формул описана область, по которой ведется интегрирование и проинтерполировать данные, то можно проинтегрировать численно полученную функцию по области.

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение18.03.2012, 23:51 


14/03/12
52
Vince Diesel
я планирую делать так: сетка ведь у меня треугольная, значит область разбита на множество треугольников, т.е. если точек у меня n, то треугольник я имею (n-1)/3. Площадь каждого треугольника я могу найти по координатам вершин. Соответственно, беру значение функции f в каждой вершине треугольника, которая является координатой z. Таким образом, {(fi1+fi2+fi3)/3}*Si, где fi-значение функции (z) в i-м треугольнике, Si - площадь треугольника. Затем суммирую по всем i-м треугольникам, которых (n-1)/3. Как думаете, логика верна?

Правда столкнулся с проблемой именно в Mathematica:
есть множество точек {{x1,y1,z1},...{xn, yn, zn}}. Как выбрать именно те, которые удовлетворяют, к примеру, требованиям: x>1,y<1, z>0.
В качестве примера:
In: Select[{{-1, -2, 11}, {3, 4, 12}, {5, 6, 13}}, VectorQ[#, # >1 &] &]
Out: {{3, 4, 12}, {5, 6, 13}}

Тем самым, я выкидываю все координаты, не удовлетворяющие "X">1. А мне надо наложить условия на каждую из координат, т.е. нужно работать в рамках не списка, а "подсписка"?

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение19.03.2012, 01:20 
Заслуженный участник


25/02/11
1797
2012 в сообщении #549870 писал(а):
я планирую делать так: сетка ведь у меня треугольная, значит область разбита на множество треугольников, т.е. если точек у меня n, то треугольник я имею (n-1)/3.

Если точек четыре, то треугольников может быть два или 3. Брать среднее арифметическое, наверное, самое простое. Заменять на средние это фактически заменять график кусками плоскостей на каждом треугольнике. Это сплайны первого порядка. Математика и лучше может приближать. Если искомая функция гладкая, конечно.

Элементы массива выбираются с помощью двойных квадратных скобок:
Код:
Select[{{-1, -2, 11}, {3, 4, 12}, {5, 6, 13}, {2, 0, 3}, {5, 0, 7}},
VectorQ[#] && #[[1]] > 1 && #[[2]] < 1 && #[[3]] > 0 &]

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение19.03.2012, 09:27 


20/12/11
44
Тоже, что и у Vince Diesel, но чуть легче читается (на мой взгляд).
Код:
cond[{x_, y_, z_}] := If[x > 1 && y < 1 && z > 0, True, False]
pts = {{-1, -2, 11}, {3, 4, 12}, {5, 6, 13}, {2, 0, 3}, {5, 0, 7}}
Select[pts, cond[#] &]

Еще можно так:
Код:
Cases[pts, {x_ /; x > 1, y_ /; y < 1, z_ /; z > 0}]

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение19.03.2012, 20:07 


14/03/12
52
Vince Diesel
gribble911

Большое спасибо!

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение22.03.2012, 14:56 


14/03/12
52
Vince Diesel
всё же погрешность большая, если брать среднее арифметическое. Треугольники далеко не равны по площади.
Попробовал просто сделать интерполяцию в Математике:
points ={{x1,y1,z1},...{xn,yn,zn}}
ifun = Interpolation[ponits]
Выдаёт ощибку: Interpolation::indim: The coordinates do not lie on a structured tensor product grid.

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение22.03.2012, 17:27 
Заслуженный участник


25/02/11
1797
Ну так среднее дложно уменожаться на площадь теругольника.

Иксы и игреки выделяются в список, надо
Код:
points ={{{x1,y1},z1},...{{xn,yn},zn}}

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение29.03.2012, 09:56 


14/03/12
52
Vince Diesel в сообщении #551145 писал(а):
Ну так среднее дложно уменожаться на площадь теругольника.

все было бы отлично, если бы я знал какие именно точки из массива образуют треугольники. Т.е. это не первые три, а, скажем первая, пятая, двенадцатая и т.д. Таким образом, это не представляется возможным.
Поэтому я положил их приблизительно равными (но вообще это не совсем так) и вычислил просто среднее арифметическое. Площадь сократилась.

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение29.03.2012, 22:37 


29/03/12
6
Привет!
Подскажите, пожалуйста, как можно решить похожую задачу. Есть массив точек, импортированный в Matlab из obj-файла, представляющий собой результат 3D моделирования импланта. Также используется треугольная сетка. Необходимо посчитать объем получившейся фигуры.
Заранее спасибо!

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение30.03.2012, 01:54 
Заслуженный участник
Аватара пользователя


23/07/08
10907
Crna Gora
Inesska
Представьте, что внутри Вашей объёмной фигуры находится некоторая точка $O$. Выберем один треугольничек сетки (назовём его $ABC$). Вместе с точкой $O$ он образует тетраэдр $OABC$. Несложно вычислить объем тетраэдра, зная координаты точек $O,A,B,C$:$$V=\frac 1 6 \begin{vmatrix}x_A-x_O & x_B-x_O & x_C-x_O\\y_A-y_O & y_B-y_O & y_C-y_O\\z_A-z_O & z_B-z_O & z_C-z_O\end{vmatrix}$$Если точка $O$ внутри фигуры является началом координат, и координаты всех точек поверхности вычислены относительно неё (этого всегда несложно добиться, надеюсь, что понятно как), то объём тетраэдра найти ещё проще:
$$V=\frac 1 6 \begin{vmatrix}x_A & x_B & x_C\\y_A & y_B & y_C\\z_A & z_B & z_C\end{vmatrix}=\frac 1 6(+ x_A y_B z_C - x_A y_C z_B + x_B y_C z_A - x_B y_A z_C + x_C y_A z_B - x_C y_B z_A)$$ А объём всей фигуры будет равен сумме объёмов тетраэдров, соответствующих всем треугольникам сетки.
Я, конечно, предполагаю, что у Вас есть список всех треугольников сетки -- какой треугольник из каких точек составлен.

:!: Но есть одна тонкость. Боюсь, нижеследующий текст будет сходу непросто воспринять. Точки $A, B, C$ -- это вершины некоторого треугольника сетки. Но мы не можем просто взять вершины и назвать любую из них $A$, другую $B$, третью $C$. Мы должны всегда, давая им имена, обходить треугольник в определенном направлении. Мы должны дать имена вершинам так, чтобы глядя на треугольничек с внешней стороны, мы видели, что замкнутый путь $ABCA$ совершается против часовой стрелки. И только тогда имеем право пользоваться приведенной формулой. Иначе надо как-то переназначить буквы (поменять местами обозначения двух вершин, например $B$ и $C$).

Если это правило соблюдать, можно правильно вычислять объемы достаточно сложных фигур, не обязательно выпуклых. В некоторых ситуациях объем каких-то тетраэдров может по приведенной формуле получиться отрицательным, и это нормально. Так будет тогда, когда поверхность в некоторых местах изогнулась таким образом, что внешняя нормаль смотрит на точку $O$, хотя обычно должна смотреть от неё -- такое может быть при сложных формах. Если нужно, приведу поясняющий рисунок.

Второй подход более простой, но менее общий.
Если фигура не слишком сложная, и можно выбрать точку $O$ так, что фигура будет звёздной относительно $O$, тогда проще просто брать модуль от объёма каждого тетраэдра, то есть игнорировать знак. Но при таком подходе объём змеи Изображение Вы уже не вычислите.

 Профиль  
                  
 
 Re: как проинтегрировать функцию в среде Mathematica
Сообщение03.04.2012, 14:40 


29/03/12
6
Большое спасибо!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group