Forum Delphi.cz

Databáze => MySQL => Téma založeno: hlucheucho 28-02-2014, 17:57:49

Název: Create Procedure - výpočet polynomu
Přispěvatel: hlucheucho 28-02-2014, 17:57:49
Ahoj

nedaří se mi přijít na to, jak realizovat výpočet. Pomocí

SELECT a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 FROM termoclanky WHERE (Typ = TcType AND Vmin <= Voltage AND Vmax >= Voltage);

získávám koeficienty z tabulky temoclanky potřebné pro výpočet teploty z naměřeného napětí. Samotný výpočet má vypadat takto:

teplota = a11 * voltage^11 + a10 * voltage ^10 + ..... + a1 * voltage + a0

zatím jsem přišel na toto:

create procedure nejak(IN Voltage float, OUT Teplota float)
begin
  set Teplota = 3 * Voltage;
end

Jak udělat výpočet, který získá koeficienty z tabulky pomocí SELECT?

Tuto teplotu chci pak vkládat do tabulky teplot, každé zařízení má svou.
MySQL ver. 5.6.11

hu

Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: Mi.Chal. 28-02-2014, 23:15:43
Tak si dej ten select do procedury a načti do proměnných, viz select into v

https://dev.mysql.com/doc/refman/5.0/en/select-into.html
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: hlucheucho 03-03-2014, 11:48:57
V C++ aplikaci bych měl koeficienty a0 ... a11 v poli a počítal to v cyklu po jednotlivých členech od nejnižšího řádu. Stačilo by jen násobení a sčítání. Předpokládám, že by tento postup měl menší nároky na strojový čas.  Pokud jsem správně pochopil, zde pole nejsou.  Je způsob jak výpočet zrychlit? Přepsání polynomu do SQL asi nebude optimální...

hu
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: pf1957 03-03-2014, 11:53:46
Ja z tveho dotazu nechapu, jestli to chces pocitac na strane Sql serveru nebo Delphi Clienta
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: Ondřej Pokorný 03-03-2014, 11:56:41
Pro tvůj účel je nejlepší si napsat vlastní funkci pro MySQL v C:

http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html (http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html)
http://www.codeproject.com/Articles/15643/MySQL-User-Defined-Functions (http://www.codeproject.com/Articles/15643/MySQL-User-Defined-Functions)

+ Já jsem si podobně napsal vlastní rozšíření MySQL i v Delphi.
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: hlucheucho 03-03-2014, 13:22:04
Ja z tveho dotazu nechapu, jestli to chces pocitac na strane Sql serveru nebo Delphi Clienta
Cílem je uložená procedura (nebo funkce) MySQL, takže na straně serveru.

Na straně klienta bych použil FireDAC, koeficienty by se daly číst FDQuery1->Fields->Fields->AsFloat (požívám C++ Builder). Pak by výše popisované zpracování cyklem nebylo problém.

Psaní funkce se mi jeví jako příliš komplikované pro řešení tohoto problému. Navíc: Je možné volat SELECT uvnitř funkce?
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: Ondřej Pokorný 03-03-2014, 14:32:22
Psaní funkce se mi jeví jako příliš komplikované pro řešení tohoto problému.

Záleží na úhlu pohledu. Ukázkový kód máš hotový, stačí ho upravit pro výpočet polynomu, což se mně jeví jako časově nenáročné.

Navíc: Je možné volat SELECT uvnitř funkce?

??? Napsal bysis pouze funkci pro výpočet polynomu z koeficientů a proměnné a tu bys zavolal nějak takhle:

Kód: [Vybrat]
SELECT POLYNOM11(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, Voltage) FROM termoclanky WHERE (Typ = TcType AND Vmin <= Voltage AND Vmax >= Voltage);

Mimochodem, polynom se programově nevypočítává po jednotlivých členech ale rozdělí se tak, aby se nekumulovalo násobení proměnné:
Kód: [Vybrat]
a0 + a1*x + a2*x^2 + a3*x^3 = a0 + x*(a1 + x*(a2 + x*a3))
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: hlucheucho 03-03-2014, 15:18:59
 S tím vytýkáním mne to nenapadlo. 24 let po maturitě začínám mít mezery  :( Proceduru už se se mi podařilo udělat.

Založil jsem dll projekt a zkusil jsem zkompilovat jejich ukázkový příklad udf_example.c. Hlásí chybu:
Multiple declaration for SSIZE_T    v souboru basetsd.h(425)
Earlier declaration of SSIZE_T    v souboru _stddef.h
a ještě několik dalších. Si nevím vůbec rady.

Používám C++ Builder XE 5.

hu
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: Mi.Chal. 03-03-2014, 22:31:57
Založil jsem dll projekt a zkusil jsem zkompilovat jejich ukázkový příklad udf_example.c. Hlásí chybu:

Proč v C? Tohle jde snad bez problému spočítat v té SQL funkci.
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: hlucheucho 04-03-2014, 08:41:27
Abych se to naučil. Nějaký návod jak na to použít C++ Builder jsem nenašel :(

hu
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: Ondřej Pokorný 04-03-2014, 10:36:32
Abych pravdu řekl, C/C++ jsem na to nepoužíval. Napsal jsem si to v Delphi:
http://stackoverflow.com/questions/5894258/creating-a-udf-for-mysql-in-delphi (http://stackoverflow.com/questions/5894258/creating-a-udf-for-mysql-in-delphi)
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: pf1957 04-03-2014, 10:49:11
Abych pravdu řekl, C/C++ jsem na to nepoužíval. Napsal jsem si to v Delphi:
Evidentne nepouzivas C++ Builder, jako on  ;)

Jako vzor UDF pro FB se udava treba http://rfunc.sourceforge.net (http://rfunc.sourceforge.net), ale ten site mi prijde nejak pochroumany, takze se mi nepovedlo dostat se ke zdrojovkam. Ty jsem nasel tady http://sourceforge.net/projects/rfunc/ (http://sourceforge.net/projects/rfunc/)
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: Ondřej Pokorný 04-03-2014, 11:10:31
S tím vytýkáním mne to nenapadlo. 24 let po maturitě začínám mít mezery  :( Proceduru už se se mi podařilo udělat.

Založil jsem dll projekt a zkusil jsem zkompilovat jejich ukázkový příklad udf_example.c. Hlásí chybu:
Multiple declaration for SSIZE_T    v souboru basetsd.h(425)
Earlier declaration of SSIZE_T    v souboru _stddef.h
a ještě několik dalších. Si nevím vůbec rady.

Používám C++ Builder XE 5.

hu

Jen horký tip:

Podle komentáře compileru tam máš 2 stejné definice pro SSIZE_T. Tak ty ze svého souboru (pravděpodobně basetsd.h) smaž.
Ten ukázkový kód bude asi pro ANSI C a to pravděpodobně SSIZE_T nezná (a C++ Builder ano), proto se to mlátí.
Název: Re:Create Procedure - výpočet polynomu
Přispěvatel: hlucheucho 04-03-2014, 21:02:36
Pravděpodobně basetsd.h je součástí windows.h.  Zkoušel jsem různá nastavení projektu a kompileru, vůbec mi to nepomohlo. Asi to dám k ledu  >:(

hu