2011-02-23 8 views
6

Estoy tratando de trazar una función en Mathematica que se define sobre la unidad simplex. Para tomar un ejemplo al azar, supongamos que quiero trazar sin (x1 * x2 * x3) sobre todo x1, x2, x3 de modo que x1, x2, x3> = 0 y x1 + x2 + x3 = 1. ¿Hay una ordenada manera de hacerlo, que no sea la manera obvia de escribir algo así como¿Cómo puedo trazar una función definida en la unidad simplex en Mathematica?

Plot3D[If[x+y<=1,Sin[x y(1-x-y)]],{x,0,1},{y,0,1}] 

Mathematica graphics ?

Lo que quiero, idealmente, es una forma de trazar solo sobre el simplex. Encontré el sitio web http://octavia.zoology.washington.edu/Mathematica/ que tiene un paquete antiguo, pero no funciona en mi versión actualizada de Mathematica.

Respuesta

3

Probar:

Plot3D[Sin[x y (1 - x - y)], {x, 0, 1}, {y, 0, 1 - x}] 

Mathematica graphics

Pero también se puede utilizar Piecewise y RegionFunction:

Plot3D[Piecewise[{{Sin[x y (1 - x - y)], 
    x >= 0 && y >= 0 && x + y <= 1}}], {x, 0, 1}, {y, 0, 1}, 
RegionFunction -> Function[{x, y}, x + y <= 1]] 
+0

éstos dan los mismos resultados que el código Publiqué en mi pregunta original. – unknowngoogle

9

Si desea obtener simétrica mirando parcelas como en ese paquete se enlazó, se necesita encontrar una matriz de rotación que coloque el símplex en el plano x/y. Puede usar esta función a continuación. Es algo largo porque lo dejé en los cálculos para descubrir el centrado simplex. Irónicamente, la transformación para la trama símplex 4d es mucho más simple. Modificar e variable para obtener diferentes margen

simplexPlot[func_, plotFunc_] := 
Module[{A, B, p2r, r2p, p1, p2, p3, e, x1, x2, w, h, marg, y1, y2, 
    valid}, 
    A = Sqrt[2/3] {Cos[#], Sin[#], Sqrt[1/2]} & /@ 
    Table[Pi/2 + 2 Pi/3 + 2 k Pi/3, {k, 0, 2}] // Transpose; 
    B = Inverse[A]; 

    (* map 3d probability vector into 2d vector *) 
    p2r[{x_, y_, z_}] := Most[A.{x, y, z}]; 

    (* map 2d vector in 3d probability vector *) 
    r2p[{u_, v_}] := B.{u, v, Sqrt[1/3]}; 

    (* Bounds to center the simplex *) 
    {p1, p2, p3} = Transpose[A]; 

    (* extra padding to use *) 
    e = 1/20; 

    x1 = First[p1] - e/2; 
    x2 = First[p2] + e/2; 
    w = x2 - x1; 
    h = p3[[2]] - p2[[2]]; 
    marg = (w - h + e)/2; 
    y1 = p2[[2]] - marg; 
    y2 = p3[[2]] + marg; 

    valid = 
    Function[{x, y}, Min[r2p[{x, y}]] >= 0 && Max[r2p[{x, y}]] <= 1]; 
    plotFunc[func @@ r2p[{x, y}], {x, x1, x2}, {y, y1, y2}, 
    RegionFunction -> valid] 
    ] 

He aquí cómo usarlo

simplexPlot[Sin[#1 #2 #3] &, Plot3D] 

http://yaroslavvb.com/upload/save/simplex-plot1.png

simplexPlot[Sin[#1 #2 #3] &, DensityPlot] 

http://yaroslavvb.com/upload/save/simplex-plot2.png

Si quieres ver de dominio en el sistema de coordenadas original , podrías girar la p montón de nuevo a la simple

t = AffineTransform[{{{-(1/Sqrt[2]), -(1/Sqrt[6]), 1/Sqrt[3]}, {1/ 
     Sqrt[2], -(1/Sqrt[6]), 1/Sqrt[3]}, {0, Sqrt[2/3], 1/Sqrt[ 
     3]}}, {1/3, 1/3, 1/3}}]; 
graphics = simplexPlot[5 Sin[#1 #2 #3] &, Plot3D]; 
shape = Cases[graphics, _GraphicsComplex]; 
Graphics3D[{Opacity[.5], GeometricTransformation[shape, t]}, 
Axes -> True] 

http://yaroslavvb.com/upload/save/raster2.png

Aquí hay otra trama simple, utilizando ejes 3D tradicionales de here y MeshFunctions->{#3&}, código completo here

http://yaroslavvb.com/upload/save/simplex.png

+0

Gracias, @Yaroslav. Sin embargo, lo que realmente esperaba era que los ejes estuvieran a los lados del símplex, de modo que realmente pudiéramos pensar en la trama como si estuviera en el símplex mismo. Una alternativa aceptable, supongo, sería eliminar el borde y etiquetar las esquinas x1 = 1, x2 = 1 y x3 = 1 (las dos variables restantes son implícitamente cero cuando el tercero es igual a uno). – unknowngoogle

+0

@unknowngoogle actualizado –

+0

Gracias de nuevo @Yaroslav. Lo que estaba imaginando era un argumento como tu primera figura arriba, pero sin la caja adjunta, y con las esquinas marcadas apropiadamente.¡Pero ahora que me has dado todos estos consejos, probablemente debería intentar resolverlo yo mismo en lugar de frecuentarte! – unknowngoogle

Cuestiones relacionadas