示例#1
0
def triangle01_poly_integral(d, p):

    #*****************************************************************************80
    #
    ## TRIANGLE01_POLY_INTEGRAL: polynomial integral over the unit triangle.
    #
    #  Location:
    #
    #    http://people.sc.fsu.edu/~jburkardt/py_src/triangle_integrals/triangle01_poly_integral.py
    #
    #  Discussion:
    #
    #    The unit triangle is T = ( (0,0), (1,0), (0,1) ).
    #
    #  Licensing:
    #
    #    This code is distributed under the GNU LGPL license.
    #
    #  Modified:
    #
    #    23 April 2015
    #
    #  Author:
    #
    #    John Burkardt
    #
    #  Parameters:
    #
    #    Input, integer D, the degree of the polynomial.
    #
    #    Input, real P(M), the polynomial coefficients.
    #    M = ((D+1)*(D+2))/2.
    #
    #    Output, real Q, the integral.
    #
    from i4_to_pascal import i4_to_pascal
    from triangle01_monomial_integral import triangle01_monomial_integral

    m = ((d + 1) * (d + 2)) / 2

    q = 0.0
    for k in range(1, m + 1):
        km1 = k - 1
        i, j = i4_to_pascal(k)
        qk = triangle01_monomial_integral(i, j)
        q = q + p[km1] * qk

    return q
def triangle01_poly_integral ( d, p ):

#*****************************************************************************80
#
## TRIANGLE01_POLY_INTEGRAL: polynomial integral over the unit triangle.
#
#  Location:
#
#    http://people.sc.fsu.edu/~jburkardt/py_src/triangle_integrals/triangle01_poly_integral.py
#
#  Discussion:
#
#    The unit triangle is T = ( (0,0), (1,0), (0,1) ).
#
#  Licensing:
#
#    This code is distributed under the GNU LGPL license. 
#
#  Modified:
#
#    23 April 2015
#
#  Author:
#
#    John Burkardt
#
#  Parameters:
#
#    Input, integer D, the degree of the polynomial.
#
#    Input, real P(M), the polynomial coefficients.
#    M = ((D+1)*(D+2))/2.
#
#    Output, real Q, the integral.
#
  from i4_to_pascal import i4_to_pascal
  from triangle01_monomial_integral import triangle01_monomial_integral

  m = ( ( d + 1 ) * ( d + 2 ) ) / 2

  q = 0.0
  for k in range ( 1, m + 1 ):
    km1 = k - 1
    i, j = i4_to_pascal ( k )
    qk = triangle01_monomial_integral ( i, j )
    q = q + p[km1] * qk

  return q
def triangle_xy_integral(x1, y1, x2, y2, x3, y3):

    #*****************************************************************************80
    #
    ## TRIANGLE_XY_INTEGRAL computes the integral of XY over a triangle.
    #
    #  Location:
    #
    #    http://people.sc.fsu.edu/~jburkardt/py_src/triangle_integrals/triangle_xy_integral.py
    #
    #  Discussion:
    #
    #    This function was written as a special test case for the general
    #    problem of integrating a monomial x^alpha * y^beta over a general
    #    triangle.
    #
    #  Licensing:
    #
    #    This code is distributed under the GNU LGPL license.
    #
    #  Modified:
    #
    #    23 April 2015
    #
    #  Author:
    #
    #    John Burkardt
    #
    #  Parameters:
    #
    #    Input, real X1, Y1, X2, Y2, X3, Y3, the coordinates of the
    #    triangle vertices.
    #
    #    Output, real Q, the integral of X*Y over the triangle.
    #

    #
    #  x = x1 * ( 1 - xi - eta )
    #    + x2 *       xi
    #    + x3 *            eta
    #
    #  y = y1 * ( 1 - xi - eta )
    #    + y2 *       xi
    #    + y3 *            eta
    #
    #  Rewrite as linear polynomials in (xi,eta):
    #
    #  x = x1 + ( x2 - x1 ) * xi + ( x3 - x1 ) * eta
    #  y = y1 + ( y2 - y1 ) * xi + ( y3 - y1 ) * eta
    #
    #  Jacobian:
    #
    #    J = [ ( x2 - x1 )  ( x3 - x1 ) ]
    #        [ ( y2 - y1 )  ( y3 - y1 ) ]
    #
    #    det J = ( x2 - x1 ) * ( y3 - y1 ) - ( y2 - y1 ) * ( x3 - x1 )
    #
    #  Integrand
    #
    #    x * y = ( x1 + ( x2 - x1 ) * xi + ( x3 - x1 ) * eta )
    #          * ( y1 + ( y2 - y1 ) * xi + ( y3 - y1 ) * eta )
    #
    #  Rewrite as linear combination of monomials:
    #
    #    x * y = 1      * x1 * y1
    #          + eta    * ( x1 * ( y3 - y1 ) + ( x3 - x1 ) * y1 )
    #          + xi     * ( x1 * ( y2 - y1 ) + ( x2 - x1 ) * y1 )
    #          + eta^2  * ( x3 - x1 ) * ( y3 - y1 )
    #          + xi*eta * ( ( x2 - x1 ) * ( y3 - y1 ) + ( x3 - x1 ) * ( y2 - y1 ) )
    #          + xi^2   * ( x2 - x1 ) * ( y2 - y1 )
    #
    from triangle01_monomial_integral import triangle01_monomial_integral

    det = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1)

    p00 = x1 * y1

    p01 = x1 * (y3 - y1) + (x3 - x1) * y1
    p10 = x1 * (y2 - y1) + (x2 - x1) * y1

    p02 = (x3 - x1) * (y3 - y1)
    p11 = (x2 - x1) * (y3 - y1) + (x3 - x1) * (y2 - y1)
    p20 = (x2 - x1) * (y2 - y1)

    q = 0.0
    q = q + p00 * triangle01_monomial_integral(0, 0)
    q = q + p10 * triangle01_monomial_integral(1, 0)
    q = q + p01 * triangle01_monomial_integral(0, 1)
    q = q + p20 * triangle01_monomial_integral(2, 0)
    q = q + p11 * triangle01_monomial_integral(1, 1)
    q = q + p02 * triangle01_monomial_integral(0, 2)

    q = q * det

    return q
示例#4
0
def triangle01_poly_integral_test():

    #*****************************************************************************80
    #
    ## TRIANGLE01_POLY_INTEGRAL_TEST: polynomial integrals over the unit triangle.
    #
    #  Licensing:
    #
    #    This code is distributed under the GNU LGPL license.
    #
    #  Modified:
    #
    #    23 April 2015
    #
    #  Author:
    #
    #    John Burkardt
    #
    import numpy as np
    from i4_to_pascal import i4_to_pascal
    from poly_print import poly_print
    from triangle01_monomial_integral import triangle01_monomial_integral

    d_max = 6
    k_max = ((d_max + 1) * (d_max + 2)) / 2
    qm = np.zeros(k_max)
    for k in range(1, k_max + 1):
        km1 = k - 1
        i, j = i4_to_pascal(k)
        qm[km1] = triangle01_monomial_integral(i, j)

    print ''
    print 'TRIANGLE01_POLY_INTEGRAL_TEST'
    print '  TRIANGLE01_POLY_INTEGRAL returns the integral Q of'
    print '  a polynomial P(X,Y) over the interior of the unit triangle.'

    d = 1
    m = ((d + 1) * (d + 2)) / 2
    p = np.array([1.0, 2.0, 3.0])
    print ''
    poly_print(d, p, '  p(x,y)')
    q = triangle01_poly_integral(d, p)
    print ''
    print '  Q =         %g' % (q)
    q2 = np.dot(p, qm[0:m])
    print '  Q (exact) = %g' % (q2)

    d = 2
    m = ((d + 1) * (d + 2)) / 2
    p = np.array([0.0, 0.0, 0.0, 0.0, 1.0, 0.0])
    print ''
    poly_print(d, p, '  p(x,y)')
    q = triangle01_poly_integral(d, p)
    print ''
    print '  Q =         %g' % (q)
    q2 = np.dot(p, qm[0:m])
    print '  Q (exact) = %g' % (q2)

    d = 2
    m = ((d + 1) * (d + 2)) / 2
    p = np.array([1.0, -2.0, 3.0, -4.0, 5.0, -6.0])
    print ''
    poly_print(d, p, '  p(x,y)')
    q = triangle01_poly_integral(d, p)
    print ''
    print '  Q =         %g' % (q)
    q2 = np.dot(p, qm[0:m])
    print '  Q (exact) = %g' % (q2)
    #
    #  Terminate.
    #
    print ''
    print 'TRIANGLE01_POLY_INTEGRAL_TEST'
    print '  Normal end of execution.'

    return
def triangle_xy_integral(x1, y1, x2, y2, x3, y3):

    # *****************************************************************************80
    #
    ## TRIANGLE_XY_INTEGRAL computes the integral of XY over a triangle.
    #
    #  Location:
    #
    #    http://people.sc.fsu.edu/~jburkardt/py_src/triangle_integrals/triangle_xy_integral.py
    #
    #  Discussion:
    #
    #    This function was written as a special test case for the general
    #    problem of integrating a monomial x^alpha * y^beta over a general
    #    triangle.
    #
    #  Licensing:
    #
    #    This code is distributed under the GNU LGPL license.
    #
    #  Modified:
    #
    #    23 April 2015
    #
    #  Author:
    #
    #    John Burkardt
    #
    #  Parameters:
    #
    #    Input, real X1, Y1, X2, Y2, X3, Y3, the coordinates of the
    #    triangle vertices.
    #
    #    Output, real Q, the integral of X*Y over the triangle.
    #

    #
    #  x = x1 * ( 1 - xi - eta )
    #    + x2 *       xi
    #    + x3 *            eta
    #
    #  y = y1 * ( 1 - xi - eta )
    #    + y2 *       xi
    #    + y3 *            eta
    #
    #  Rewrite as linear polynomials in (xi,eta):
    #
    #  x = x1 + ( x2 - x1 ) * xi + ( x3 - x1 ) * eta
    #  y = y1 + ( y2 - y1 ) * xi + ( y3 - y1 ) * eta
    #
    #  Jacobian:
    #
    #    J = [ ( x2 - x1 )  ( x3 - x1 ) ]
    #        [ ( y2 - y1 )  ( y3 - y1 ) ]
    #
    #    det J = ( x2 - x1 ) * ( y3 - y1 ) - ( y2 - y1 ) * ( x3 - x1 )
    #
    #  Integrand
    #
    #    x * y = ( x1 + ( x2 - x1 ) * xi + ( x3 - x1 ) * eta )
    #          * ( y1 + ( y2 - y1 ) * xi + ( y3 - y1 ) * eta )
    #
    #  Rewrite as linear combination of monomials:
    #
    #    x * y = 1      * x1 * y1
    #          + eta    * ( x1 * ( y3 - y1 ) + ( x3 - x1 ) * y1 )
    #          + xi     * ( x1 * ( y2 - y1 ) + ( x2 - x1 ) * y1 )
    #          + eta^2  * ( x3 - x1 ) * ( y3 - y1 )
    #          + xi*eta * ( ( x2 - x1 ) * ( y3 - y1 ) + ( x3 - x1 ) * ( y2 - y1 ) )
    #          + xi^2   * ( x2 - x1 ) * ( y2 - y1 )
    #
    from triangle01_monomial_integral import triangle01_monomial_integral

    det = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1)

    p00 = x1 * y1

    p01 = x1 * (y3 - y1) + (x3 - x1) * y1
    p10 = x1 * (y2 - y1) + (x2 - x1) * y1

    p02 = (x3 - x1) * (y3 - y1)
    p11 = (x2 - x1) * (y3 - y1) + (x3 - x1) * (y2 - y1)
    p20 = (x2 - x1) * (y2 - y1)

    q = 0.0
    q = q + p00 * triangle01_monomial_integral(0, 0)
    q = q + p10 * triangle01_monomial_integral(1, 0)
    q = q + p01 * triangle01_monomial_integral(0, 1)
    q = q + p20 * triangle01_monomial_integral(2, 0)
    q = q + p11 * triangle01_monomial_integral(1, 1)
    q = q + p02 * triangle01_monomial_integral(0, 2)

    q = q * det

    return q
def triangle01_poly_integral_test ( ):

#*****************************************************************************80
#
## TRIANGLE01_POLY_INTEGRAL_TEST: polynomial integrals over the unit triangle.
#
#  Licensing:
#
#    This code is distributed under the GNU LGPL license.
#
#  Modified:
#
#    23 April 2015
#
#  Author:
#
#    John Burkardt
#
  import numpy as np
  from i4_to_pascal import i4_to_pascal
  from poly_print import poly_print
  from triangle01_monomial_integral import triangle01_monomial_integral

  d_max = 6
  k_max = ( ( d_max + 1 ) * ( d_max + 2 ) ) / 2
  qm = np.zeros ( k_max )
  for k in range ( 1, k_max + 1 ):
    km1 = k - 1
    i, j = i4_to_pascal ( k )
    qm[km1] = triangle01_monomial_integral ( i, j )

  print ''
  print 'TRIANGLE01_POLY_INTEGRAL_TEST'
  print '  TRIANGLE01_POLY_INTEGRAL returns the integral Q of'
  print '  a polynomial P(X,Y) over the interior of the unit triangle.'

  d = 1
  m = ( ( d + 1 ) * ( d + 2 ) ) / 2
  p = np.array ( [ 1.0, 2.0, 3.0 ] )
  print ''
  poly_print ( d, p, '  p(x,y)' )
  q = triangle01_poly_integral ( d, p )
  print ''
  print '  Q =         %g' % ( q )
  q2 = np.dot ( p, qm[0:m] )
  print '  Q (exact) = %g' % ( q2 )

  d = 2
  m = ( ( d + 1 ) * ( d + 2 ) ) / 2
  p = np.array ( [ 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 ] )
  print ''
  poly_print ( d, p, '  p(x,y)' )
  q = triangle01_poly_integral ( d, p )
  print ''
  print '  Q =         %g' % ( q )
  q2 = np.dot ( p, qm[0:m] )
  print '  Q (exact) = %g' % ( q2 )

  d = 2
  m = ( ( d + 1 ) * ( d + 2 ) ) / 2
  p = np.array ( [ 1.0, -2.0, 3.0, -4.0, 5.0, -6.0 ] )
  print ''
  poly_print ( d, p, '  p(x,y)' )
  q = triangle01_poly_integral ( d, p )
  print ''
  print '  Q =         %g' % ( q )
  q2 = np.dot ( p, qm[0:m] )
  print '  Q (exact) = %g' % ( q2 )
#
#  Terminate.
#
  print ''
  print 'TRIANGLE01_POLY_INTEGRAL_TEST'
  print '  Normal end of execution.'

  return