将自定义函数拟合到open / Libreoffice-calc

时间:2018-05-04 10:29:48

标签: curve-fitting openoffice-calc libreoffice-calc data-fitting trendline

我有一系列数据,例如:

0.767838478
0.702426493
0.733858228
0.703275979
0.651456058
0.62427187
0.742353261
0.646359026
0.695630431
0.659101665
0.598786652
0.592840135
0.59199059

我知道最好的形式方程式:

y=ae^(b*x)+c

enter image description here

如何使自定义函数适合此数据? Similar question had been already asked on LibreOffice forum without a proper answer。如果你能帮助我知道怎么做,我将不胜感激。优选地,答案适用于任何自定义函数,而不是适用于此特定情况的变通方法。提前谢谢。

3 个答案:

答案 0 :(得分:1)

有多种可能的解决方案。但有一种方法如下:

要确定趋势线函数a中的by = a*e^(b*x),可以使用原生Calc函数(LINESTEXPLN)。

因此我们可以将y = a*e^(b*x)+c视为y-c= a*e^(b*x),因此如果我们知道c,我们也可以采用y = a*e^(b*x)的解决方案。怎么知道c? Exponential Curve Fitting中描述了一种方法。然后进行b,a和c的逼近。

我将Exponential Curve Fitting : source listing的delphi代码的主要部分翻译为StarBasic Calcc的微调部分直到现在才翻译。作为专业和发烧友程序员的待办事项。

示例:

enter image description here

数据:

x   y
0   0.767838478
1   0.702426493
2   0.733858228
3   0.703275979
4   0.651456058
5   0.62427187
6   0.742353261
7   0.646359026
8   0.695630431
9   0.659101665
10  0.598786652
11  0.592840135
12  0.59199059

公式:

B17=EXP(INDEX(LINEST(LN($B$2:$B$14),$A$2:$A$14),1,2))

C17=INDEX(LINEST(LN($B$2:$B$14),$A$2:$A$14),1,1)

y = a*e^(b*x)也是用于图表趋势线计算的函数。

B19=INDEX(TRENDEXPPLUSC($B$2:$B$14,$A$2:$A$14),1,1)

C19=INDEX(TRENDEXPPLUSC($B$2:$B$14,$A$2:$A$14),1,2)

D19=INDEX(TRENDEXPPLUSC($B$2:$B$14,$A$2:$A$14),1,3)

代码:

function trendExpPlusC(rangey as variant, rangex as variant) as variant

 'get values from ranges
 redim x(ubound(rangex)-1) as double
 redim y(ubound(rangex)-1) as double
 for i = lbound(x) to ubound(x)
  x(i) = rangex(i+1,1)
  y(i) = rangey(i+1,1)
 next

 'make helper arrays
 redim dx(ubound(x)-1) as double
 redim dy(ubound(x)-1) as double
 redim dxyx(ubound(x)-1) as double
 redim dxyy(ubound(x)-1) as double
 for i = lbound(x) to ubound(x)-1
  dx(i) = x(i+1) - x(i)
  dy(i) = y(i+1) - y(i)
  dxyx(i) = (x(i+1) + x(i))/2
  dxyy(i) = dy(i) / dx(i)
 next

 'approximate b
 s = 0
 errcnt = 0
 for i = lbound(dxyx) to ubound(dxyx)-1
  on error goto errorhandler
  s = s + log(abs(dxyy(i+1) / dxyy(i))) / (dxyx(i+1) - dxyx(i))
  on error goto 0
 next
 b = s / (ubound(dxyx) - errcnt)

 'approximate a
 s = 0
 errcnt = 0
 for i = lbound(dx) to ubound(dx)
  on error goto errorhandler
  s = s + dy(i) / (exp(b * x(i+1)) - exp(b * x(i)))
  on error goto 0
 next
 a = s / (ubound(dx) + 1 - errcnt)

 'approximate c 
 s = 0
 errcnt = 0
 for i = lbound(x) to ubound(x)
  on error goto errorhandler
  s = s + y(i) - a * exp(b * x(i))
  on error goto 0
 next
 c = s / (ubound(x) + 1 - errcnt)

 'make y for (y - c) = a*e^(b*x)
 for i = lbound(x) to ubound(x)
  y(i) = log(abs(y(i) - c))
 next

 'get a and b from LINEST for (y - c) = a*e^(b*x)
 oFunctionAccess = createUnoService( "com.sun.star.sheet.FunctionAccess" )
 args = array(array(y), array(x))
 ab = oFunctionAccess.CallFunction("LINEST", args)

 if a < 0 then a = -exp(ab(0)(1)) else a = exp(ab(0)(1))

 b = ab(0)(0)

 trendExpPlusC = array(a, b, c)

exit function

errorhandler:
 errcnt = errcnt + 1
 resume next

end function

答案 1 :(得分:0)

公式 y = be ax 是LibreOffice图表趋势线的exponential regression equation

exponential equation chart

答案 2 :(得分:0)

LibreOffice导出所有设置 LibreOffice的所有设置都在LibreOffice文件夹中。

  

C:\ Users \ a←安装操作系统时,名称   \ AppData←File Manager〜“ Hidden project”打开,AppData进入。   文件夹将显示。\ Roaming \ LibreOffice

备份LibreOffice文件夹,重新安装时,将LibreOffice文件夹放回原来的位置。

  

注意:
  1.如果安装为预览版,因为预览版的名称为LibreOfficeDev,则LibreOfficeDev文件夹将为   显示。
  2.正式版可以与预览版一起安装,如果同时安装了正式版和预览版,则可以使用LibreOffice   文件夹和LibreOfficeDev文件夹将显示。
  3.要清除所有设置,只需删除LibreOffice文件夹,然后打开程序,将创建一个新的LibreOffice文件夹。

LibreOffice导出我制作的单个工具栏 共同路径

  

C:\ Users \ a←安装操作系统时,名称   \ AppData←File Manager〜“ Hidden project”打开,AppData进入。   文件夹将是   显示。\ Roaming \ LibreOffice \ 4 \ user \ config \ soffice.cfg \ modules \ Please   在下面连接各个软件的分支路径。

分支路径

\modules\StartModule\toolbar\The "Start" toolbar I made is placed here.

\modules\swriter\toolbar\The "writer" toolbar I made is placed here.

\modules\scalc\toolbar\The "calc" toolbar I made is placed here.

\modules\simpress\toolbar\The "impress" toolbar I made is placed here.

\modules\sdraw\toolbar\The "draw" toolbar I made is placed here.

\modules\smath\toolbar\The "math" toolbar I made is placed here.

\modules\dbapp\toolbar\The "base" toolbar I made is placed here.

备份文件,在重新安装时,将文件放在原始位置。

  

注意:

     
      
  1. 由于我自己创建了工具栏,默认文件名将自动使用编号,因此打开文件时,可以知道文件名   工具栏。
  2.   
  3. 前面的文件名“ custom_toolbar_”不能更改,更改将导致错误,后面的文件名可以更改。例如:   custom_toolbar_c01611ed.xml→custom_toolbar_AAA.xml。
  4.   
  5. 做好工具栏,可以复制到其他地方使用。例如:在“编写器”工具栏做得很好,可以复制为“计算”   使用的地方。
  6.   

LibreOffice自制符号工具栏

  

步骤1 ,在“开始”中,依次单击“工具”>“选项” \“高级” \“启用宏录制”。   “工具\宏”,将出现“记录宏”选项。

     

步骤2 录制宏工具\宏\录制宏→录制动作(单击“Ω”输入符号→选择符号→插入)→停止   记录→存储在“模块1”中的宏名称为Main→Modify Main   名称→保存。

     

步骤3 添加项目新工具栏Tools \ Customize \ Toolbar→添加→输入名称(例如:符号)→确定,新工具栏将显示在顶部   左。

     

第4步:宏将添加​​新工具栏工具\ Customize \ Toolbar \ Category \ Macros \ My   宏\标准\模块1 \主要→单击“主要”→添加项目→修改→重命名(可以   用符号命名)→确定→确定。