主题:[讨论]最小二乘法的编程问题
493508923@qq,com
[专家分:0] 发布于 2012-08-16 16:24:00
大家好,小女子在此请教编程问题,希望能收到您的回复,对,就是正看这段文字的您!!!!!问题:如何编写最小二乘法的程序?由于算法本身计算步骤复杂(本人认为,不代表高手您),还要涉及多次迭代,因此头脑一乱问题就来了,彻底没了头绪,希望高手您能留下您的宝贵的编写该程序的思想,如果您很忙留下简单的编写轮廓也行,小女子将不胜感激。万分急急急!!!!!!!
下面是我编写的问题程序(将算法应用到了层析成像中),感觉很乱,而且全是按算法步骤一步步来的,还不能反回去迭代,所以它需要您的诊断。
回复列表 (共3个回复)
沙发
493508923@qq,com [专家分:0] 发布于 2012-08-16 16:29:00
程序超过5000字符了所以粘不上去,那请高手根据您的知识指导下小女子吧
板凳
cheese_0715 [专家分:10] 发布于 2012-08-19 11:54:00
一个最小二乘程序大致上需要如下变量:
设计矩阵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 楼
493508923@qq,com [专家分:0] 发布于 2012-08-22 15:47:00
现在还有个问题,我编写了一个阻尼最小二乘法模拟波速的程序,迭代了四次显示数据溢出了,经查看发现数据溢出发生在矩阵求逆的子程序处,被求逆的矩阵是36*36的矩阵,矩阵中的大多数元素都是-11次方左右的数量级,请高手帮忙分析下这种溢出问题该怎么解决?
我来回复