Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 16. 1. 2018 12:54:40

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Vyhodnocení textu jako vzorce - VYŘEŠENO

Zdravím,
potřeboval bych zadávat vzorec pro integraci jako text, takže něco jako je funkce eval v javaskriptu.

Představuju si to nějak takto:

Function Funkce(Vzorec as String, X as Double) As Double
	Funkce = Eval(Vzorec)
End Function

Přičemž do vzorce bych mohl napsat cokoli, třeba "X^3 - 2*X + 1/X"  a funkce by se volala s libovolným parametrem X.

Dá se to nějak jednoduše udělat? Taky bych potřeboval, aby to bylo rychlé na zpracování ... smile

Editoval LADER (18. 1. 2018 22:13:41)


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#2 16. 1. 2018 17:17:50

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Ano dá se to udělat ve StarBasicu trošku složitěji, ale existuje také přímo JavaScript pro LO (a složitěji pro AOO). Já s tím v současné době dost koketuji takže náhodou přepisuji Javascript pro použití v LibreOffice. Když byste měl o tyto postupy zájem rád se zapojím.


      Existují různé zdroje. Já osobně mám zájem zejména o JSON, AJAX a JQuery. Můj zdroj pracuje zatím jen podle toho co jsem viděl se Swingem. Jinak je to nejlepší soubor maker jaké jsem kde našel. Odkazuje na ně někdy také Andew Pitonyak - on a B. Marcely jsou absolutní špičky. Zdroj JavaScript
je tam příklad

// eval
importClass(Packages.javax.swing.JOptionPane);
var oPI = java.lang.Math.PI
var oNum = eval(oPI/2) 
JOptionPane.showMessageDialog(null, oNum);

Bohužel také nevím jestli "eval" nedělá stále chybu právě když se umocňuje.
--------------------------------------------------------------------------

     Ale řešení lze udělat v Basicu zejména pokud je tam jenom jeden parametr číselného typu. Když se jedná o základní parametry tak problém by být neměl. Problémy vznikají když se ve vzorci má objevit text. Specializované vzorce sešitu se konvertují do Basicu a dají se i maticové.


     Funkce popsaná vypadá že skutečně vrací jen hodnotu a že se má zadávat do buňky jako vzorec. Takže některé věci takto jistě udělat půjdou. Jednoduše se provede cyklem substituce "X" přímo za číslo které se ověří zda je číslem. Vloží se výsledek, ale mohl by to být i vzorec.
     Ovšem asi ne všechny výrazy půjdou jednoduše zadat. (To by stačil na vše jediný vzorec a když si prohlédneme průvodce funkcí tak nic tak univerzálního postavit nejde). - Ale vím o co jde v podstatě libovolnou operaci ze základních operátorů vyplivnout jako číslo a ne vzorec.


     Chápu že jde o rychlost a ne o kódění. Doporučil bych náhradu nahraným makrem, které se opětovně načte a vloží jako hodnota. To sice jde pomocí UNO, ale je snadnější načíst StarBasicem hotový otestovaný vzorec a pak už vracet je hodnoty. Má to výhodu když nebude vzor správně opravíte a pak doděláte už testované.


     Dnes začnu testovat zadání podle popisu a když tak mrknu na zpracování načteného vzorce. Vy se podívejte na ty Japonské stránky. Potřebujete Google překladač Já ho mám jako rozšíření pro FireFox (taková jakoby kniha) ale úplně nejlepší je rozšíření překladače ve tvaru červeného velkého T. Tímto vyberete japonský text a dáte přeložit - a je z toho čeština přímo na stránce. - To už pak zkopírujete do editoru. Jde mi o rychlost kterou z Basicu nedostanu - JavaScript je rychlý.


     Takže u mne nejde přímo o scriptování pro kancelářskou aplikaci - ale tuto používat jako editor s vlastními vzory HTML5 a knihovnami funkcí.

Editoval neutr (16. 1. 2018 17:29:24)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 16. 1. 2018 17:28:13

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 167

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

jak píše neutr, lze to v javascriptu a pythonu. Nevím, jak to chcete použít, pro jednorázový výpočet se to přímo v calcu dá obejít přes pomocnou buňku, do které se uloží vzorec a spočítá výsledek, např. do A1 zapíšu vzorec 5^X+7*X-12 , do B1 zapíšu proměnnou 7 a A10 použiji jako pomocnou buňku. Funkce do A10 ukládá vzorec, který se v calcu vyhodnotí, a načte z této pozice výsledek.
Funkce stojí na tom, že proměnná ve vzorci se musí jmenovat X (bylo by možné upravit na více proměnných) a volá se jednotlivě (z důvodu toho ukládání do pomocné buňky).

Option VBASupport 1
Function Spocti_vzorec (vzorec as String, promenna as Double) As Double
a="="&replace(vzorec,"X",promenna)
range("A10").Formula=a
Spocti_vzorec=range("A10").Value
End Function

Offline

#4 16. 1. 2018 19:27:58

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Zdravím,
tak jsem to s Vaší pomocí nějak sbastlil. Asi to není úplně ono, zejména mě mate, že musím přidat mezeru (v kódu pro javascript), tam bude nějaká chyba, nejspíš v převodu na string.
Můj kód zatím vypadá na straně Basicu takto:

Function Fuj(Vzorec as String, X as Double) As Variant
	Dim oSP, oScript, Y(1) as Variant
	Y(0) = Vzorec
	Y(1) = X
	oSP = ThisComponent.getScriptProvider()
	oScript = oSP.getScript("vnd.sun.star.script:Library1.Macro1.js?language=JavaScript&location=document")
	Fuj = Val(oScript.invoke(Y, Array(), Array()))	
End Function

A javascript:

pole = new Array(ARGUMENTS.length);
for(i = 0; i < pole.length; i++)
	pole[i] = ARGUMENTS[i];

eval(Fuj(pole));

function Fuj(pole) {
	var x = parseFloat(pole[1]);
        var X = x
	var z = " " + pole[0];
	with (Math) {z = eval(z)};	
      	return z;
};

Mocnina chodí tak, že místo x^2 dám pow(x,2), fungují tam trigonometrické i exponenciální funkce.
Je tam rozdíl: Přirozený logaritmus v Calcu je Ln(), v javascriptu je Log().
Upraveno: není to citlivý na velikost písmen, takže parametr X může být napsán malým i velkým písmem.

Editoval LADER (16. 1. 2018 21:51:36)


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#5 16. 1. 2018 19:59:23

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Jasně - to je ten problém - četl jsem to někde že si eval neporadí s mocninou, ale je toho asi víc.
Udělal jsem něco v Basic, ale vrací to vzorec i když to počítá - chtěl jsem tam jen číslo - ještě se musím podívat ale zatím :

Function MojeFunkce(ByVal vzorec as string, ByVal x as long)
Dim sVar as string
Dim iVar, sVal  as variant
'----------------------------------------------------------
For i = 1 To LEN(vzorec) ' řeší problém chyby ve vzorci X=x
IF Mid(vzorec,i,1) = "x" Then
sVar = sVar & "X" 
Else
sVar = sVar & Mid(vzorec,i,1)
End If
Next i
'----------------------------------------------------------
For i = 1 To LEN(sVar) ' nahradí X hodnotou
IF Mid(sVar,i,1) = "X" Then
sVal = sVal & x 
Else
sVal = sVal & Mid(sVar,i,1)
End If
Next i
sVal = "=" & sVal
'----------------------------------------------------------
oCell = ThisComponent.CurrentController.getSelection() 
With oCell.RangeAddress 
SH = .Sheet 
SC = .StartColumn 
SR = .StartRow
End With 
'----------------------------------------------------------
oSheet = ThisComponent.Sheets(SH) 
oCell = oSheet.GetCellbyPosition(SC, SR)
oCell.Formula = sVal
MojeFunkce = oCell.Value
end Function

     Vzorec musí být v uvozovkáchm umí si poradit s chybou kdy si spleteme velikost X,x a je možné přidat optional parametr (Y,y). Jsem celkem překvapený že v buňce je vzorec a ne notace na funkci. Tohle jsem hledal před několika lety a nenašel. Teď jsem překvapený - ale je to dáno změnou - OASIS ale je to elaborát tak se podívám když bych si jinak neporadil.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#6 16. 1. 2018 21:03:45

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Tak jsem ten Váš kód trochu upravil:

Function Evaluate(ByVal Vzorec as String, ByVal X as Double)
	Dim sChar$, sVar$, sX$, sXX$ 
	Dim sVal, nVal  as Variant
	Dim i&, SH!, SC!, SR!
	Dim oSheet, oCell as Object
	'----------------------------------------------------------
	sX = Cstr(X)
	
	sXX=""
        For i = 1 To LEN(sX) ' Nahradí čárku za tečku v čísle
		sChar = Mid(sX,i,1)
		IF sChar = "," Then
			sXX = sXX & "." 
		Else
			sXX = sXX & sChar
		End If
	Next i
	
	sVal = ""
	For i = 1 To LEN(vzorec) ' Nahradí velká X za číslo (malé x má konflikt s exp)
		sChar = Mid(vzorec,i,1)
		IF sChar = "X" Then ' Nebo písmeno řecké abecedy
			sVal = sVal & sXX 
		Else
			sVal = sVal & sChar
		End If
	Next i

	sVal = "=" & sVal
	
	'----------------------------------------------------------
	oCell = ThisComponent.CurrentController.getSelection() 
	With oCell.RangeAddress 
		SH = .Sheet 
		'SC = .StartColumn		
		'SR = .StartRow	
		SC = 15
		SR = 0	' Tady jsem změnil na pevný místo - mazalo mi to funkci
	End With 
	'----------------------------------------------------------
	oSheet = ThisComponent.Sheets(SH) 
	oCell = oSheet.GetCellbyPosition(SC, SR)
	oCell.Formula = sVal
	Evaluate = oCell.Value	
End Function

Chodí docela dobře, ale vzorec nesmí být v uvozovkách

Editoval LADER (16. 1. 2018 22:35:26)


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#7 16. 1. 2018 21:58:23

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

LADER napsal(a)

    For i = 1 To LEN(vzorec) ' Nahradí velká X za číslo (malé x má konflikt s exp)
    '----------------------------------------------------------
    With oCell.RangeAddress
        SH = .Sheet
        SC = 15
        SR = 0    ' Tady jsem změnil na pevný místo - mazalo mi to funkci
    End With
    '----------------------------------------------------------

     Tak že by vznikl konflikt se string "x" a proměnnou x bez uvozovek tomu se mi nějak nechce věřit, ale klidně se dala proměnná přepsat z malého x na něco jiného - třeba Cis aj.
     U proměnných záměna velkého a malého písmene nevadí. Naopak při iteraci charů to vadí. Načítat je pak potřeba jen Index listu. Funkce nechá zápis tam kde je spuštěna A do vzorce už šlo vložit přímo pevné hodnoty. To je ten problém který mne udivil. Dřív se nic takového nestávalo.
     Jsou to ty změny které asi budu muset prostudovat protože to nemusí být jediné překvapení. Je toho hodně ale je to tady Jde o verzi OpenDocument 1.2 - takže zřejmě jen LO.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#8 16. 1. 2018 22:07:35

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Proměnou X jsem zkusil změnit za písmeno řecké abecedy - funguje to. Nebude tedy konflikt s funkcí exp(), která obsahuje písmeno x. Příklad: pokud jsem měnil x za číslo 2, pak se funkce exp(x) změnila takto: e2p(2).

Editoval LADER (16. 1. 2018 22:29:09)


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#9 16. 1. 2018 22:37:32

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Já sice nevím k čemu to potřebujete, ale třeba nerozumím poznámce Vzorec  =Ucase(Vzorec). Tohle dělají funkce normálně. Změna čárky na tečku je jasná - zřejmě nejde o češtinu ale nejpíš zdroj do CSV - pak dává smysl i UperCase.
    Proto také výše uvádím, že lze zařadit také optional (nepovinnou) proměnnou třeba pro X^Y. I když mne zajímá právě například vytvoření neobtruzivního Javascriptu, který vygeneruji, spustím a pak zabiju. Vygenerovaný soubor hodlám načítat databází a editovat pomocí JQuery. Naše Base umí jen Select a tak hledám možnost suplovat databáze. Oni se dají používat dialogy takže tohle je můj zájem o JavaScript. Vy jste první u koho vidím, že zřejmě překračujete běžné uživatelské využívání.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#10 16. 1. 2018 22:46:35

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

k příspěvku #8 :
     Tohle musíte řešit obezřetně. Lze se spoléhat jen na jednoduché operátory, a nebo zapsat přesnou anotaci výrazu ze vzorce sešitu. Možná Vám pomůže emulace funkcí - příklady ale musíte je prověřit už nemusí fungovat - potřebují změnit anotaci ale na ukázku :

Function MaxVal(args()) 'Array 2D od B. Marcelly
dim oFA as Object
oFA = createUNOService("com.sun.star.sheet.FunctionAccess")
MaxVal = oFA.callFunction("MAX", Array(args))
End Function

Function PrikladyFunkci_2arg 'Původně COUNTIF
    Dim svc As Object
    dim k as long, i As Long, sVar as string
    svc = createUnoService("com.sun.star.sheet.FunctionAccess")
    k = 11
    dim myArray(k,0) as Variant
    for i = 0 to k
    myArray(i,0) = INT(100*Rnd) 'původní
    sVar = sVar & "  " & myArray(i,0)
    next i
    sVar = sVar  & Chr(10) & "Množina výběru - hledá se 3. hodnota pořadí"
    msgbox (sVar & Chr(10) & Chr(10) & "= " & svc.callFunction("Small", Array(myArray, 3)),0, "Small")
    msgbox (sVar & Chr(10) & Chr(10) & "= " & svc.callFunction("Large", Array(myArray, 3)),0, "Large")
end function

Function VVJOIN(v(), optional sep)
REM Výběr úseku jako *v* = vektor *sep* = volitelný separátor (default "")
REM používá se k SLOUČENÍ + TRANSPOZICI úseků buněk do jediné buňky
On Error Goto NullErr
   If isMissing(sep) then sep = ""
   iLB = lBound(v(), 1)
   iUB = uBound(v(), 1)
REM převde z 2D pole do pole 1D:
   Dim a(iLB to iUB)
   For i = iLB to iUB
  a(i) = v(i, 1)
   next
   VVJOIN = join(a(), sep)
exit function
NullErr:
REM return #VALUE
   VVJOIN = Null
'=VVJOIN(A1:A9;",")						Vertikální vektor bez separátoru
'=VVJOIN(TRANSPOSE(A1:H1))				Horizontální vektor bez separátoru
'=VVJOIN(A1:A9;" ")						Vertikální vektor - odděleno mezerou
'=TRIM(VVJOIN(A1:A9;" "))				Vertikální vektor - počáteční a koncové mezery odstraněny
'=TRIM(VVJOIN(TRANSPOSE(A1:A9);" "))	Vertikální vektor - vodorovně
End Function


'------------------------------------------------------------------------------Vzory import vzorců Function Arccos1(X As Double) As Double 'funguje skvěle zadává se číslo -1 až 1 Různá syntax Arccos1 Arccos2 Arccos3
   DIM args(1 TO 1) As Variant
   args(1) = X
   calc = createUnoService( "com.sun.star.sheet.FunctionAccess")
   Arccos1 = calc.CallFunction( "ACOS", args() )
End Function   'Arccos

Function Arccos2(X As Double) As Double 'funguje skvěle zadává se číslo -1 až 1 Různá syntax Arccos1 Arccos2 Arccos3
   calc = createUnoService( "com.sun.star.sheet.FunctionAccess")
   Arccos2 = calc.CallFunction( "ACOS", ARRAY(X) )   
End Function   'Arccos

Function Arccos3(X As Double) As Double 'funguje skvěle zadává se číslo -1 až 1 Různá syntax Arccos1 Arccos2 Arccos3
   calc = createUnoService( "com.sun.star.sheet.FunctionAccess")
   Arccos3 = calc.CallFunction( "ACOS", ARRAY(X) )
End Function
'--------------------------------------------------------------------------------------- Podobně například factoriál
Function FACT1(X As Double) As Double 'funguje skvěle zadává se číslo 0 až něco 
   DIM args(1 TO 1) As Variant
   args(1) = X
   calc = createUnoService( "com.sun.star.sheet.FunctionAccess")
   FACT1 = calc.CallFunction( "FACT", args() )
End Function   'Arccos

Function FACT2(X As Double) As Double
   calc = createUnoService( "com.sun.star.sheet.FunctionAccess")
   FACT2 = calc.CallFunction( "FACT", ARRAY(X) )   
End Function   'Arccos

Sub Prikadyfunkci_1D
        svc = createUnoService( "com.sun.star.sheet.FunctionAccess" )
        arg = array( 3.456 )
        print svc.callFunction( "LOG10", arg )
        arg = array( 10, 2 )
        print svc.callFunction( "POWER", arg )
        arg = array( "A-", "FOO", 2, "BAR" )
        print svc.callFunction( "CONCATENATE", arg )        
        oSheet = ThisComponent.Sheets(0)
        oCellRange = oSheet.getCellRangeByPosition( 0, 0, 0, 2 )
        arg = array( oCellRange )
        print svc.callFunction( "SUM", arg )        
End Sub

Function TRIM2(X As Variant) As Variant
   calc = createUnoService( "com.sun.star.sheet.FunctionAccess")
   Trim2 = calc.CallFunction( "TRIM", ARRAY(X) )   
End Function 
'------------------------------------------------------------------------------Neodzkoušeno 2 závislé funkce
    'Global g_FunctionAccess

Function STRINGCOUNT(swhat,swhere,bRegex)
    REM count how many times swhat is in swhere using SEARCH with regex support
    REM or case sensitive FIND
    REM "aa" is matched 2 times in "aaa" (at pos 1 and pos 2)
    on error goto ExitErr
       s = cStr(swhat) : v = cStr(swhere) : b =cBool(bRegex)
       if b then
          sF = "SEARCH" 'case insensitive regex pattern
       else
          sF = "FIND" 'case sensitive literal
       endif
       oFA = getFunctionAccess()
       oFA.RegularExpressions = b
       m = 0
       STRINGCOUNT = 0
       do
          m = oFA.callFunction(sF, Array(s, v, m +1))
          STRINGCOUNT = StringCount +1
       loop
    ExitErr:
End Function

Function getFunctionAccess()
    if isObject(g_FunctionAccess) then
       getFunctionAccess = g_FunctionAccess
    else
       g_FunctionAccess = createUnoService("com.sun.star.sheet.FunctionAccess")
       getFunctionAccess = g_FunctionAccess
    endif
End Function
'------------------------------------------------------------------------------Vzory import vzorců do Basic konec
function ArrayFormula1(par as variant) as variant '=test1(a1:a3)
    test1=par
end function

function ArrayFormula2(a,b,c) as variant 'Vložit matici (ctrl-shift-enter) =test8(A1;A2;A3), pole A1,A2,A3 má hodnoty
dim pole(1 to 3) as variant
    pole(1) = a
    pole(2) = b
    pole(3) = c
    test8 = pole
end function

Function DecBin(X as Double) as String 'Převod dekadického čísla na binární
	Dim S as String 
	X = Int(Abs(X))
	While X > 0 
		S = CStr(X mod 2) + S
		X = Int(X / 2)
	Wend
	DecBin = S
End Function

Function DecOct(X as Double) as String
	Dim S as String 
	X = Int(Abs(X))
	While X > 0 
		S = CStr(X mod 8) + S
		X = Int(X / 8)
	Wend
	DecOct = S
End Function

Function CHAR_(X As single) as string 'Tohle je pro náhradu z CHR(Unicode 16bit)
   dim args(0) as single
   args(0) = X
   scalc = createUnoService( "com.sun.star.sheet.FunctionAccess")
   CHAR_ = scalc.CallFunction( "CHAR", args )
End Function

Function Code_(S As string) as integer 'Tohle je pro náhradu z ASC(Unicode 16bit)
   dim args(0) as string
   args(0) = S
   scalc = createUnoService( "com.sun.star.sheet.FunctionAccess")
   Code_ = scalc.CallFunction( "CODE", args )
End Function 

Sub Max_ 
       svc = createUnoService( "com.sun.star.sheet.FunctionAccess" )
       arg = array( 10, 23, 5, 345 )
       print svc.callFunction( "MAX", arg )
End Sub

     Tedy fakt se to musí odzkoušet - už jsem plno věcí musel upravit a tak to dělám jen když potřebuju.

Editoval neutr (16. 1. 2018 22:53:51)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#11 16. 1. 2018 23:47:03

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Tuto funkci jsem potřeboval pro výpočet integrálu. Mám několik způsobů, tady je jednodušší z nich (Proměnné A a B značí rozsah integrace, proměnná N přesnost):

Function Composite_simpsons_rule(ByVal A#, ByVal B#, ByVal N#)
	Dim K#, H#, S#
	
	If A>B Then
		H = A
		A = B
		B = H
	EndIf	
	
	N = 2*Int(Abs(N)) + 2
	H = (B-A)/N
	
	S = 0
	For K = A + 2*H To B - 3/2*H step H
		S = S + Funkce(K)
		K = K + H
		S = S + 2 * Funkce(K)
	Next	
	
	Composite_simpsons_rule = (2*S + 4*Funkce(A+H) + Funkce(A) + Funkce(B)) * H / 3
End Function 

Který volal následující funkci (v průměru tak 20x až 400x podle požadované přesnosti), vzorec uvnitř je pouze jako příklad:

Function Funkce(X#) As Double
	Funkce = (2*X^3-X+3)/X^2 
End Function

A protože funkce je pokaždé jiná (nebo často se mění), tak jsem chtěl, aby se zadávala do Calcu a ne do Basicu. Tím by to bylo uživatelsky jednodušší.

Jakou verzi evaluace vzorce použiji, záleží na tom, která bude rychlejší. Ale to až příště.

Výpočet integrálu bez javascriptu

Editoval LADER (17. 1. 2018 01:43:15)


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#12 18. 1. 2018 18:22:11

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Závěr:


První způsob - Přes Javascript to funguje, můžu mít výpočtů kolik chci, je však asi 4x pomalejší a má trochu jinou syntaxi.
Druhý způsob - Se zápisem do pracovní buňky. Funguje pouze jedna instance. Pokud počítám dva, nebo více vzorců na listu, jsou výsledky chybné. Adresu pracovní buňku mám napevno (někde stranou) a je společná pro všechny výpočty. A to je špatně. Pro každý výpočet by musela být jiná adresa, jenže jak to udělat bez vědomí uživatele. Nejlepší by bylo, kdyby se na listu vůbec nenacházela. Už její přítomnost mate.


Určitě by to šlo, kdyby se při volání funkce zadala i adresa pracovní buňky, jenže to je další parametr, který by uživatel musel řešit.


Vypadá to, že to nebude jednoduché ...


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#13 18. 1. 2018 18:51:38

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Zatím, aby to bylo použitelné, generuji adresu řádku a sloupce náhodně po celém (druhém) listu.
256 sloupců a 65536 řádků způsobí, že chyba se jen tak neobjeví ... smile


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#14 18. 1. 2018 19:15:46

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 167

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

záleží, jak to máte implementzované, jak (kde) jsou zapsané vzorce a kde proměnné. Jestli to zpracováváte nějakým cyklem, tam znáte adresu buňky a můžete ten vzorec = výsledek ukládat do nějakého skrytého listu na stejnou pozici.

Offline

#15 18. 1. 2018 20:27:44

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Mám napsané makro a volám jej takto (příklad):

=NIntegrate("sin(X)"; 0; Pi(); 20)

První parametr je integrovaný výraz
Druhý parametr je počátek integrace
Třetí parametr je konec integrace
Čtvrtý parametr je počet úseků (tj. přesnost)


Odkaz na soubor s přidaným listem pro pracovní buňky. Pravděpodobnost že se chyba projeví je velmi nízká, ale je potřeba druhý list o názvu "NI"...


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#16 18. 1. 2018 22:15:20

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 144

Re: Vyhodnocení textu jako vzorce - VYŘEŠENO

Zatím se s tím nebudu zabývat, označuji vyřešeno. Děkuji za spolupráci.


Ubuntu 22.04.1 LTS, LibreOffice Verze: 7.4.6.2, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

Zápatí