回 帖 发 新 帖 刷新版面

主题:[讨论]最小二乘法的编程问题

大家好,小女子在此请教编程问题,希望能收到您的回复,对,就是正看这段文字的您!!!!!问题:如何编写最小二乘法的程序?由于算法本身计算步骤复杂(本人认为,不代表高手您),还要涉及多次迭代,因此头脑一乱问题就来了,彻底没了头绪,希望高手您能留下您的宝贵的编写该程序的思想,如果您很忙留下简单的编写轮廓也行,小女子将不胜感激。万分急急急!!!!!!!

下面是我编写的问题程序(将算法应用到了层析成像中),感觉很乱,而且全是按算法步骤一步步来的,还不能反回去迭代,所以它需要您的诊断。

回复列表 (共3个回复)

沙发

程序超过5000字符了所以粘不上去,那请高手根据您的知识指导下小女子吧

板凳

一个最小二乘程序大致上需要如下变量:
设计矩阵Amat,残差矩阵Lmat,所求参数初始值x,所求解的dx,全局迭代控制变量布尔con(control)

需要如下函数:
初始化函数,对各个矩阵分配内存,对变量赋初始值等。Set();
计算设计矩阵Amat和残差矩阵Lmat的函数:CalAL();
计算根据dx的函数:CalDx();
矩阵求逆函数:MatInverse();

大致的流程:
Set()
!声明变量tmpdx用于存放上一次解算的dx,用于判断是否终止迭代。
do while(con. eq. true)
   con = .false.

   !根据X计算AL
   CalAL()

   !根据AL计算dx
   CalDx()

   !更新X
   !循环 (x(i) = x(i) + dx(i))
   !一般通过前后两次解算的dx之差的绝对值小于某个限定值来判断是否终止迭代。
   !将dx(i)赋值给tmpdx(i)

   do i = 1, num
      if(dabs(tmpdx(i) - dx(i))> kesai)con = .true.
      x(i) = x(i) + dx(i)
      tmpdx(i) = dx(i)
   enddo

enddo

3 楼


现在还有个问题,我编写了一个阻尼最小二乘法模拟波速的程序,迭代了四次显示数据溢出了,经查看发现数据溢出发生在矩阵求逆的子程序处,被求逆的矩阵是36*36的矩阵,矩阵中的大多数元素都是-11次方左右的数量级,请高手帮忙分析下这种溢出问题该怎么解决?

我来回复

您尚未登录,请登录后再回复。点此登录或注册