Agradecemos tu apoyo para extender nuestras crónicas con relación a las ciencias de la computación.
Solución:
Aquí está cómo hacerlo, solo deja ToElementMesh
crear la malla:
Needs["NDSolve`FEM`"]
mesh = ToElementMesh[pts];
values = #[[1]], #[[2]], #[[1]] #[[2]]^2 & /@ pts;
int = ElementMeshInterpolation[mesh, values[[All, 3]]];
Length[pts], Length[mesh["Coordinates"]]
1001, 1001
Plot3D[int[x, y], x, y [Element] mesh]
En términos generales, dado un conjunto de puntos ToBoundayMesh
devolverá un casco convexo y ToElementMesh
devolverá una triangulación de Delaunay.
Probar
mesh = ToElementMesh[[email protected]
, MeshQualityGoal -> 0 ,"MeshOrder" -> 1 ];
Esta es una malla triangular simple (¡sin puntos adicionales!)
Length[pts]==Length[mesh["Coordinates"]]
(*True*)
values = #[[1]] #[[2]]^2 & /@ mesh["Coordinates"];
fFE = ElementMeshInterpolation[mesh, values];
Plot3D[fFE[x, y], Element[x, y, mesh] ]
pienso Interpolation
hace lo que quieres debajo del capó (básicamente lo que dijo @MarcoB):
ifn = Interpolation[[email protected]pts, values[[All, 3]],
InterpolationOrder -> 1];
emesh = [email protected]"ElementMesh";
emesh["Wireframe"]
Tenga en cuenta que controló la construcción de la malla de la manera que quería.
Actualizar.
Puedes construir la malla de esta manera:
mymesh = ToElementMesh[[email protected], MeshQualityGoal -> 0,
MaxCellMeasure -> Infinity, "IncludePoints" -> pts,
"MeshOrder" -> 1];
[email protected]["Wireframe"] === [email protected]["Wireframe"]
(* True *)
Las coordenadas están ordenadas de manera diferente a pts
por lo que necesitamos permutar los valores en consecuencia para construir el ElementMeshInterpolation
:
myvalues =
values[[All, 3]][[
[email protected] pts]][[
[email protected][email protected][email protected]"Coordinates"]];
myifn = ElementMeshInterpolation[mymesh, myvalues];
Plot3D[myifn[x, y], x, y ∈ mymesh]
Comprobar equivalencia:
myifn[##] === ifn[##] & @@
[email protected][[email protected], 10000]
(* True *)