logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak uprościć wyrażenia algebraiczne w Delphi dla przekształtników?

kiziorxxx 19 Kwi 2010 14:21 1958 7
REKLAMA
  • #1 7979101
    kiziorxxx
    Poziom 9  
    Posty: 56
    Ocena: 2
    Witam, piszę program, który wyprowadza równania stanu dla przekształtników energoelektronicznych. Podczas rozwiązywania układu równań metodą eliminacji Gaussa równania robią się zbyt długie i stwarza mi to problem. Mój problem polega na tym, że potrzebuję funkcję która będzie mi upraszczać wyrażenie algrebraiczne np:
    wyrażenie:
    R1+R2+2*(R1+R2)/(2)
    sprowadzi do postaci
    2*R1+2*R2

    inny przykład:
    (0-(+1)*((-UC1)/(-R1)))/(+1)
    gdzie wynik to:
    -UC1/R1

    w wyrażeniu są używane operatory:
    '+', '-', '*', '/' oraz nawiasy okrągłe " ( ) "
    wszystkie zmienne w wyrażeniu są wcześniej dane. Wyrażenie jest typu string.
    Nie musi być dokładnie tak uproszczone, chodzi mi o to aby wyrażenie zdecydowanie było krótsze. Mam świadomość, że taką możliwość mam w programach Mathematica i Maple. W tym problem, że ja muszę mieć to w delphi.
    Czy może ktoś wie jak to zrobić, ma zrobione takie coś, postaram się wynagrodzić znaczącą pomoc, lub wie w jakiej książce mogę to znaleźć.

    Z góry dziękuję za pomoc.
    pozdrawiam
  • REKLAMA
  • #2 7981773
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    Jak uprościć wyrażenia algebraiczne w Delphi dla przekształtników?
    jest tam *.dll, gada się z tym doskonale, w chyba 20 linijkach miałem konsolowy superkalkulator

    sprawdź tam Simplify(r1+r2+2*(r1+r2)/2)
    z welkiej litery
  • REKLAMA
  • #3 7982516
    arnoldziq
    VIP Zasłużony dla elektroda
    Posty: 5376
    Pomógł: 789
    Ocena: 300
    Xitami napisał:
    jest tam *.dll, gada się z tym doskonale, w chyba 20 linijkach miałem konsolowy superkalkulator

    No to proszę jeszcze opisać, dokładnie, jak to połączyć z Delphi i temat będzie można zamknąć.
  • #4 7984459
    kiziorxxx
    Poziom 9  
    Posty: 56
    Ocena: 2
    Możesz napisać coś więcej?? Albo coś źle robię ale nie ma w tej bibliotece funkcji Simplify.

    pozdrawiam
  • REKLAMA
  • Pomocny post
    #5 7985243
    Xitami
    Poziom 29  
    Posty: 1130
    Pomógł: 118
    Ocena: 31
    nie mam tu tego programu ale wystarczyło mi wiedzieć to:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "cyacas.h"
    
    int main(int argc, char** argv)
    {
      yacas_init();
    
      int i;
      for (i=1;i<argc;i++)
      {
        yacas_eval(argv[i]);
        if (yacas_error())
        {
          printf("Error> %s\n",yacas_error());
        }
        else
        {
          if (yacas_output())
          {
            printf("Output>\n%s\n",yacas_output());
          }
            printf("Result> %s\n",yacas_result());
    
        }
      }
      yacas_exit();
      return 0;
    }

    taki program oblicza wyrażenia które są parametrem wywołania

    w pascalu wystarczy external dla yacas_init(), yacas_eval(), yacas_output(), yacas_exit() yacas_error(), może przydać yacas_error() :-)

    yacas_eval('Simplify(r1+r2+2*...)'#0) {uwaga typ pchar}

    aha, trzeba jeszcze wiedzieć:
    YACASDLL_API void yacas_init();
    /** yacas_eval : evaluate an expression. The result (or possible error)
     *  can be obtained through the yacas_error and yacas_result functions,
     *  if so desired.
     */
    YACASDLL_API void yacas_eval(char* expression);
    
    /** yacas_error : return a pointer to a string explaining the error
     *  if an error occurred, or NULL otherwise.
     */
    YACASDLL_API char* yacas_error();
    /** yacas_result : return a string representation of the result of
     *  evaluating an expression. This function is only meaningful if
     *  there was no error. In the case of an error, the return value
     *  of yacas_result should be considered undefined.
     */
    YACASDLL_API char* yacas_result();
    
    /** yacas_output : return pointer to output printed while evaluating
     * an expression.
     */
    YACASDLL_API char* yacas_output();
    
    /** yacas_exit : clean up all things related to the main Yacas
     *  evaluation environment
     */
    YACASDLL_API void yacas_exit();
    
    
  • #6 7985365
    kiziorxxx
    Poziom 9  
    Posty: 56
    Ocena: 2
    nie czuję się orłem w Delphi, mówiąc szczerze pierwszy mam do czynienia a bibliotekami, ale wyskrobalem takie coś

    
    
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
      end;
        const
    
      yacas='C:\yacasdll';
    
    var
      Form1: TForm1;
      s: string = 'Simplify(r1+r2+2*(r1+r2)/2)';
    
    implementation
    
     procedure yacas_init();            external yacas name 'yacas_init';
    procedure yacas_eval(expresion:pchar); external yacas name 'yacas_eval';
    function  yacas_error(): pchar;        external yacas name 'yacas_error';
    function  yacas_result():pchar;        external yacas name 'yacas_result';
    function  yacas_output():pchar;        external yacas name 'yacas_output';
    procedure yacas_exit();                external yacas name 'yacas_exit';
    
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       yacas_init;
       showmessage(pchar(@s[1]));
       yacas_eval(pchar(@s[1]));
    
       showmessage('err '+yacas_error);
       showmessage(yacas_output);
       showmessage(yacas_result);
    
            yacas_exit;
    end;
    
    end.
    
    
    



    i wyskakuje mi taki bląd:
    Error on line 1 in file [CommandLine] Error parsinf expression

    możesz coś mi na to poradzic?
  • REKLAMA
  • #7 7988276
    kiziorxxx
    Poziom 9  
    Posty: 56
    Ocena: 2
    błąd znaleziony tak wygląda prawidłowy kod:



    
    
    unit Unit1;
    
    interface
    
    uses
      ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
      end;
    
    
    
        const
    
      yacas='C:\yacasdll';
    
    
    
    var
      Form1: TForm1;
      s: string = 'Simplify(a*a)';
      p : pchar;
    
    implementation
    
        procedure yacas_init;    stdcall;         external yacas name 'yacas_init';
    procedure yacas_eval(expresion:pchar); stdcall;  external yacas name 'yacas_eval';
    function  yacas_error: pchar; stdcall;       external yacas name 'yacas_error';
    function  yacas_result:pchar;   stdcall;      external yacas name 'yacas_result';
    function  yacas_output:pchar;   stdcall;      external yacas name 'yacas_output';
    procedure yacas_exit;           stdcall;      external yacas name 'yacas_exit';
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    
       yacas_init;
       s:=s+#0;
    
       p := Addr(s[1]);
    
       showmessage(p);
       yacas_eval(p);
    
    
       showmessage('err '+yacas_error);
       showmessage(yacas_output);
       showmessage(yacas_result);
    
            yacas_exit;
    end;
    
    end.
    
    
    
    





    Został tylko jeden problem i można temat zamknąć, funkcja ma na wejściu typ char czyli 255 znaków, jest to trochę mało dla mnie, pytanie brzmi czy można to jakoś obejść??

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukuje sposobu na uproszczenie wyrażeń algebraicznych w Delphi dla przekształtników energoelektronicznych, szczególnie podczas rozwiązywania układów równań metodą eliminacji Gaussa. Wskazano na potrzebę funkcji, która uprości wyrażenia typu string, takie jak R1+R2+2*(R1+R2)/(2) do postaci 2*R1+2*R2. Użytkownicy polecają bibliotekę Yacas, która umożliwia uproszczenie wyrażeń, a także dzielą się fragmentami kodu w Delphi, które integrują tę bibliotekę. Pojawiły się również uwagi dotyczące poprawności kodu oraz różnic między typami danych w Delphi.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA