Подгонка пользовательских функций к данным - PullRequest
0 голосов
/ 04 мая 2018

У меня есть ряд данных, например:

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

Formula

Как мне приспособить пользовательскую функцию к этим данным?

Подобный вопрос уже задавался на форуме LibreOffice без правильного ответа. Буду признателен, если вы поможете мне узнать, как это сделать. Предпочтительно ответы, применяемые к любой пользовательской функции, а не обходные пути для этого конкретного случая.

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Есть несколько возможных решений для этого. Но один подход будет следующим:

Для определения a и b в функции линии тренда y = a*e^(b*x) существуют решения, использующие собственные функции Calc (LINEST, EXP, LN).

Таким образом, мы можем y = a*e^(b*x)+c принять за y-c= a*e^(b*x), и поэтому, если мы знаем c, решение для y = a*e^(b*x) также может быть принято. Как узнать с? Один подход описан в Пример экспоненциальной кривой . Там аппроксимация b, a, а затем c.

У меня есть основная часть кода delphi из Пример экспоненциальной кривой: список источников переведен в StarBasic для Calc. Часть тонкой настройки c до сих пор не переведена. To-Do для вас, как профессиональных программистов и энтузиастов.

Пример:

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
0 голосов
/ 10 апреля 2019

LibreOffice экспортирует все настройки Все настройки LibreOffice, все в папке LibreOffice.

C: \ Users \ a ← При установке операционной системы имя Введено. \ AppData ← Файловый менеджер ~ "Скрытый проект", чтобы открыть, AppData папка будет отображаться. \ Roaming \ LibreOffice

Создайте резервную копию папки LibreOffice, при переустановке поместите папку LibreOffice на прежнее место.

Примечание:
1. Если установка является предварительным выпуском, потому что имя предварительного выпуска - LibreOfficeDev, поэтому папка LibreOfficeDev будет отображается.
2. Официальную версию можно установить вместе с предварительной версией, если установлены как формальная версия, так и предварительная версия, LibreOffice папка и папка LibreOfficeDev будут отображаться.
3. Чтобы очистить все настройки, просто удалите папку LibreOffice, затем откройте программу, будет создана новая папка LibreOffice.

LibreOffice экспортирует одну созданную мной панель инструментов Общий путь

C: \ Users \ a ← При установке операционной системы имя Введено. \ AppData ← Файловый менеджер ~ "Скрытый проект", чтобы открыть, AppData папка будет отображается. \ Roaming \ LibreOffice \ 4 \ пользователь \ Config \ soffice.cfg \ Modules \ Пожалуйста, подключите путь перехода отдельного программного обеспечения ниже.

Путь ответвления

\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. Имя переднего файла "custom_toolbar_" не может быть изменено, изменение приведет к ошибке, имя файла может быть изменено. Например: custom_toolbar_c01611ed.xml → custom_toolbar_AAA.xml.
  3. Хорошо справьтесь с панелью инструментов, можно скопировать в другие места для использования. Например: в «Writer» Do хорошо панели инструментов, можно скопировать в «calc» места для использования.

Панель инструментов самодельного символа LibreOffice

Шаг 1 Запустите «Функция записи макросов» Инструменты \ Параметры \ Дополнительно \ Включить запись макросов (Tick), в «Инструменты \ Макросы», появится опция «Запись макроса».

Шаг 2 Инструменты записи макросов \ Макросы \ Запись макроса → Действие записи (нажмите «Ω», чтобы ввести символ → выбрать символ → Вставить) → Стоп Запись → Макросы, хранящиеся в «Module1», называются Main → Modify Main. имя → Сохранить.

Шаг 3 Добавление элемента новой панели инструментов Инструменты \ Настройка \ Панель инструментов → Добавить → Введите имя (пример: символ) → ОК, новая панель инструментов появится в верхней части влево.

Шаг 4 Will Macros Добавить элемент новой панели инструментов Инструменты \ Настройка \ Панель инструментов \ Категория \ Макросы \ My Макросы \ Standard \ Module1 \ Main → Нажмите «Main» → Добавить элемент → Изменить → Переименовать (можно именоваться символом) → ОК → ОК.

0 голосов
/ 04 мая 2018

Формула y = be ax является уравнением экспоненциальной регрессии для трендовых линий графика LibreOffice.

exponential equation chart

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...