Fortran Coder

标题: 谁有可用的拟合非线性方程的程序? [打印本页]

作者: likm1110    时间: 2015-11-6 15:16
标题: 谁有可用的拟合非线性方程的程序?
已有数据,我想把它拟合为形式是 [latex]f(x)=a{x}^{b}{e}^{-\frac{x}{c}}[/latex] 的函数。a,b,c是参数。
使用附件数据文件的第一行和第三行。
谢谢!

W_r_v1_test.dat

72.46 KB, 下载次数: 6

数据文件


作者: fcode    时间: 2015-11-6 15:39
这是非线性回归问题。
一般采用高斯牛顿法迭代,或马奎特法。
作者: likm1110    时间: 2015-11-6 15:54
fcode 发表于 2015-11-6 15:39
这是非线性回归问题。
一般采用高斯牛顿法迭代,或马奎特法。

是这个吧Levenberg-Marquardt method。
我在NR上找到了这个程序,但是没太明白怎么用。。。
我用高斯试验时候在执行时得到了错误提示:‘Program received signal SIGSEGV: Segmentation fault - invalid memory reference.‘
应该是数组的问题,不过过程内部哪里有问题我也没搞懂...
作者: likm1110    时间: 2015-11-6 16:11
标题: 求助:关于非线性拟合程序Marquardt method
想用gauss随机数试验非线性拟合程序。
在执行中出现报错:
!========================================================
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
#0  0x7F80E544ED18
#1  0x7F80E544DEA0
#2  0x7F80E4949A4F
#3  0x405BF8 in __fitpack_MOD_mrqmin
#4  0x406214 in MAIN__ at t_nonlinear.f95:?
Segmentation fault (core dumped)
!========================================================
拟合程序摘自: ‘Numerical Recipes‘ 第1292页



td.dat

6.87 KB, 下载次数: 5

gauss datas

t_nonlinear.f90

12.4 KB, 下载次数: 6

拟合程序


作者: fcode    时间: 2015-11-6 17:44
对。这个就是马奎特法的代码。
出问题是正常的,代码得调。
晚点我给你看看吧。(现在有事情忙)

作者: vvt    时间: 2015-11-8 09:47
你确定一下你的被拟合函数是不是正确的??存在负数的指数函数么?那就是复变函数咯?
作者: likm1110    时间: 2015-11-9 10:30
vvt 发表于 2015-11-8 09:47
你确定一下你的被拟合函数是不是正确的??存在负数的指数函数么?那就是复变函数咯? ...

这个完全是书上给出的例子。是高斯分布。基本从书上摘抄
作者: likm1110    时间: 2015-11-9 10:30
fcode 发表于 2015-11-6 17:44
对。这个就是马奎特法的代码。
出问题是正常的,代码得调。
晚点我给你看看吧。(现在有事情忙)

多谢!我自己也好好找一下。执行过程有问题最坑了....
作者: kerb    时间: 2015-11-9 23:33
本帖最后由 kerb 于 2015-11-9 23:35 编辑

这个着急不得,你先得计算雅克比矩阵,LM只是迭代时候防止溢出的策略,因为雅克比矩阵条件数非常大,矩阵接近奇异,所以LM法对矩阵的对角元素加上一个小的数,另外,你还得搞明白线性搜索,否则即便你拿到代码,你也不会用,我觉得你最好从非线性方程求根或者优化算法看起,弄明白了,再来做这个,否则事倍功半
作者: likm1110    时间: 2015-11-10 18:57
kerb 发表于 2015-11-9 23:33
这个着急不得,你先得计算雅克比矩阵,LM只是迭代时候防止溢出的策略,因为雅克比矩阵条件数非常大,矩阵接 ...

学长告诉我可以直接试一下origin或者gnuplot拟合,他说非线性拟合程序有些复杂,他都没用过
作者: fcode    时间: 2015-11-10 21:02
其实非线性拟合倒不是那么难。难就难在你的公式里有 x 的 b 次方,而且 x 还是负数。
作者: kerb    时间: 2015-11-12 17:33
本帖最后由 kerb 于 2015-11-12 17:40 编辑

[latex]\min{S}(a,b,c)=\frac{1}{2}\sum_{i=1}^N(f(x_i)-y_i)^2=\frac{1}{2}\sum_{i=1}^N(ax_i^be^{-\frac{x_i}{c}}-y_i)^2[/latex]









欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2