找回密码
 注册
Simdroid-非首页
查看: 142|回复: 12

[H. 有限元编程] 【讨论】域内点插值

[复制链接]
发表于 2011-7-12 09:38:22 | 显示全部楼层 |阅读模式 来自 吉林长春
本帖最后由 hhf_cas 于 2011-7-12 09:50 编辑

我已经有一系列平面单元(1255个节点,非规则,含三节点三角单元、四节点四边形单元)及节点的计算结果,需将这些节点计算结果插值到一系列规则正方形单元的的节点上,请问如何实现?力求计算量较小。
补充:我这后续软件只能识别方格子上的信息,边界可以忽略
发表于 2011-7-12 09:44:59 | 显示全部楼层 来自 山东烟台
Simdroid开发平台
还不如重新分网,重新计算
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-12 09:48:48 | 显示全部楼层 来自 吉林长春
2# zccbest 对于一个不是方正的结构(比如说圆),根本难以画出规则格子。我这后续软件只能识别方格子上的信息,边界可以忽略
回复 不支持

使用道具 举报

发表于 2011-7-12 13:24:51 | 显示全部楼层 来自 山东烟台
这个比较复杂吧,先要确定后来的节点坐落在原先哪个单元内,根据原来单元的插值函数求解单元内任意一点的函数值
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-12 14:15:53 | 显示全部楼层 来自 吉林长春
3# hhf_cas 确实是需要判断,所以我想求教达人,有无比较快速的算法?
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-12 14:16:18 | 显示全部楼层 来自 吉林长春
4# zccbest 确实是需要判断,所以我想求教达人,有无比较快速的算法
回复 不支持

使用道具 举报

发表于 2011-7-14 17:25:02 | 显示全部楼层 来自 陕西西安
方形的格子你怎么画?以我的理解,你的几何很难划分成结构单元。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-15 08:53:10 | 显示全部楼层 来自 吉林长春
7# chentao807 自己用程序生成格子,落在域内的点插值,域外的赋0
回复 不支持

使用道具 举报

发表于 2011-7-15 09:05:58 | 显示全部楼层 来自 北京
这个要用到搜索算法,计算量应该少不了,同时还要保证精度,建议参考无网格用的插值方法
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-15 09:21:11 | 显示全部楼层 来自 吉林长春
9# fanxiaochen 我又这个想法,只是计算速度有待实践。估计边界上的精度不会太好
回复 不支持

使用道具 举报

发表于 2011-7-15 20:25:57 | 显示全部楼层 来自 上海普陀区
我已经有一系列平面单元(1255个节点,非规则,含三节点三角单元、四节点四边形单元)及节点的计算结果,需将这些节点计算结果插值到一系列规则正方形单元的的节点上,请问如何实现?力求计算量较小。
补充:我这后 ...
hhf_cas 发表于 2011-7-12 09:38

既然有这个要求,为何不用边界元或者无网格方法呢?
甚至有限差分法都可以,如果边界不复杂
回复 不支持

使用道具 举报

发表于 2011-7-16 02:32:07 | 显示全部楼层 来自 美国
本帖最后由 caoer 于 2011-7-15 13:35 编辑

your idea is doable.

here is my interpolation class written in C++.
No public variable exists, so the header file is ignored.

  1. #include "polynomial_interpolants.hpp"

  2. #include "../general/spectral_common.hpp"



  3. //algorithem 30

  4. void PolynomialInterpolants::BraycentricWeigths(const int N,

  5.                                                 const double *x_vec,

  6.                                                 double  *w_vec)

  7. {

  8.     int j,k;



  9.     for (j = 0; j<=N; j++)

  10.         *(w_vec+j) = 1.0;



  11.     for (j=1; j<=N; j++)

  12.     {

  13.         for (k = 0; k<j; k++)

  14.         {

  15.             *(w_vec+k) = *(w_vec+k) * (*(x_vec+k) - *(x_vec+j));

  16.             *(w_vec+j) = *(w_vec+j) * (*(x_vec+j) - *(x_vec+k));

  17.         }

  18.     }

  19.     for (j=0; j<=N; j++)

  20.         *(w_vec+j) = 1/ *(w_vec+j);

  21. };







  22. // Algorithm 31

  23. double PolynomialInterpolants::LagrangeInterpolation(const unsigned int N,

  24.                                                      const double x,

  25.                                                      const double *x_vec,

  26.                                                      const double *f_vec,

  27.                                                      const double *w_vec)

  28. {

  29.     double t;

  30.     double numerator = 0.0, denominator = 0.0;

  31.     SpectralCommon *pSC = new SpectralCommon();



  32. //    std::cout<<"N = "<< N << std::endl;

  33. //    for (unsigned int i=0; i<= N; i++)

  34. //        std::cout<<x_vec[i] <<" , "<< f_vec[i]<<" , "<< w_vec[i]<<std::endl;



  35.     for (unsigned int j = 0; j<=N; j++)

  36.     {

  37.         if (pSC->AlmostEqual(x, x_vec[j]))

  38.         {

  39.             return f_vec[j];

  40.         }

  41.         else

  42.         {

  43.             t = w_vec[j]/(x - x_vec[j]);

  44.             numerator   = numerator + t* f_vec[j];

  45.             denominator = denominator + t;

  46.         }

  47.     }



  48.     delete pSC;

  49.     return numerator/denominator;

  50. }







  51. // Algorithm 32

  52. void PolynomialInterpolants::PolynomialInterpolationMatrix(const int N,

  53.                                                            const int M,

  54.                                                            const double *x_vec,

  55.                                                            const double *w_vec,

  56.                                                            const double *xi_vec,

  57.                                                            double *T_mtx)

  58. {

  59.     bool rowHasMatch;

  60.     int k, j;

  61.     double s, t;

  62.     SpectralCommon *pSC = new SpectralCommon();



  63.     for (k=0; k<=M; k++)

  64.     {

  65.         rowHasMatch = false;

  66.         for (j=0; j<=N; j++)

  67.         {

  68.             *(T_mtx+k*(N+1) + j)=0;



  69.             if (pSC->AlmostEqual(*(xi_vec+k), *(x_vec+j)))

  70.             {

  71.                 rowHasMatch = true;

  72.                 *(T_mtx+k*(N+1)+j) = 1;

  73.             } //if

  74.         } // for j

  75.         if (!rowHasMatch)

  76.         {

  77.             s = 0;

  78.             for(j=0; j<=N; j++)

  79.             {

  80.                 t = *(w_vec+j)/(*(xi_vec+k)- *(x_vec+j));

  81.                 *(T_mtx+k*(N+1)+j) = t;

  82.                 s = s + t;

  83.             }

  84.             for (j = 0; j<=N; j++)

  85.                 *(T_mtx +k*(N+1)+j) = *(T_mtx +k*(N+1)+j) / s;



  86.         } // if

  87.     } //for k

  88.     delete pSC;

  89. }







  90. // Algorithm 33

  91. void PolynomialInterpolants::InterpolateToNewpoints(const int M,

  92.                                                     const int N,

  93.                                                     const double *T_mtx,

  94.                                                     const double *f_vec,

  95.                                                     double *fInterp_vec)

  96. {

  97.     int i,j;

  98.     double t;

  99.     for(i =0; i<=M; i++)

  100.     {

  101.         t = 0;

  102.         for(j=0; j<=N; j++)

  103.             t = t+ *(T_mtx +i*(N+1)+j) * *(f_vec +j);

  104.         *(fInterp_vec+i) = t;

  105.     }

  106. }





  107. // Algorithm 34

  108. void PolynomialInterpolants::LagrangeInterpolatingPolynomials(const int N,

  109.                                                               const double x,

  110.                                                               const double *x_vec,

  111.                                                               const double *w_vec,

  112.                                                               double *l_vec)

  113. {

  114.     bool xMatchesNode= false;

  115.     double s, t;

  116.     int j;

  117.     SpectralCommon *pSC = new SpectralCommon();



  118.     for (j =0; j<=N; j++)

  119.     {

  120.         *(l_vec+j) = 0.0;

  121.         if (pSC->AlmostEqual(x, *(x_vec+j)))

  122.         {

  123.             *(l_vec+j) = 1.0;

  124.             xMatchesNode = true;

  125.         }

  126.     } // for j



  127.     if (!xMatchesNode)

  128.     {

  129.         s = 0.0;

  130.         for (j = 0; j <= N; j++)

  131.         {

  132.             t = *(w_vec+j)/(x - *(x_vec+j));

  133.             *(l_vec+j) = t;

  134.             s = s + t;

  135.         }

  136.         for(j = 0; j<= N; j++)

  137.             *(l_vec+j) = *(l_vec+j) / s;

  138.     } //if



  139.     delete pSC;

  140. }
复制代码
回复 不支持

使用道具 举报

 楼主| 发表于 2011-7-19 09:30:05 | 显示全部楼层 来自 吉林长春
12# caoer Thank you so much. I'm deeply moved by your enthusiasm.
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-26 16:10 , Processed in 0.034805 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表