Autor Téma: Parsovani matematickych vyrazu  (Přečteno 15349 krát)

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Parsovani matematickych vyrazu
« kdy: 03-08-2012, 01:13:16 »
Ahoj,

parsuji matematicke vyrazy pres knihovnu flee.dll, zde je odkaz: http://flee.codeplex.com/releases/view/8625 bohužel tato knihovna vykresluje v grafu spatne vyrazy typu: -x^2+4, vykresli se spatne, ale kdyz ji napisu takto: -(x^2)+4, vykresli se dobre. Nemate nekdo nejaky jiny matematicky parser s ukazkou pouziti???
« Poslední změna: 03-08-2012, 10:52:33 od <z> »

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:Parsovani matematickych varazu
« Odpověď #1 kdy: 03-08-2012, 01:15:28 »
Toto je metoda pro výpočet určitého integrálu středovou metodou:

Kód: C++ [Vybrat]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Ciloci.Flee;
  6. using ZedGraph;
  7. using System.Drawing;
  8. using NCalc;
  9.  
  10. namespace Určitý_Integrál
  11. {
  12.     class Middle
  13.     {
  14.         public double hodnotaFunkceMiddle(string textFunkce, double sirkaObdelnikuZ, double spodniHraniceZ, int pocetObdelnikuZ, double horniHraniceZ)
  15.         {
  16.             // vytvoreni a zkopilovani vyrazu
  17.             ExpressionContext context = new ExpressionContext();
  18.             context.Imports.AddType(typeof(Math));
  19.             context.Variables["x"] = (double)0; // vytvoreni promenne, na hodnote nezalezi
  20.             IGenericExpression<double> eGeneric = context.CompileGeneric<double>(textFunkce);
  21.            
  22.             /*
  23.             Expression context = new Expression(textFunkce);
  24.             context.Parameters["x"] = (double)0;
  25.             */
  26.  
  27.             double celkovyObsah = 0; // vsech obdelniku
  28.             double stredObdelniku = spodniHraniceZ + sirkaObdelnikuZ / 2; // stred prvniho obdelniku
  29.  
  30.             for (int i = 0; i < pocetObdelnikuZ; i++)
  31.             {
  32.                 // pro kazdy obdelnik
  33.                 context.Variables["x"] = stredObdelniku; // dosazeni hodnoty
  34.                 double hodnotaFunkceVeStreduObdelniku = eGeneric.Evaluate(); // hodnota v bode, kde pritona funkce stred obdelnika
  35.                 double obsahObdelniku = hodnotaFunkceVeStreduObdelniku * sirkaObdelnikuZ; // obsah obdelnicku
  36.                 celkovyObsah += obsahObdelniku;
  37.  
  38.                 stredObdelniku += sirkaObdelnikuZ; // stred dalsiho obdelniku
  39.             }
  40.             return celkovyObsah;
  41.         }
  42.  
  43.         public void CreateGraphMiddle(ZedGraphControl zgc, string textFunkce, double sirkaObdelnikuZ, double spodniHraniceZ, int pocetObdelnikuZ, double horniHraniceZ)
  44.         {
  45.             zgc.GraphPane.CurveList.Clear();
  46.  
  47.             // vytvoreni a zkopirovani vyrazu
  48.             ExpressionContext context = new ExpressionContext();
  49.             context.Imports.AddType(typeof(Math));
  50.             context.Variables["x"] = (double)0; // vytvoreni promenne, na hodnote nezalezi
  51.             IGenericExpression<double> eGeneric = context.CompileGeneric<double>(textFunkce);
  52.  
  53.  
  54.             GraphPane myPane = zgc.GraphPane;
  55.  
  56.             myPane.Title.Text = "Graf funkce: " + textFunkce;
  57.             myPane.XAxis.Title.Text = "x";
  58.             myPane.YAxis.Title.Text = "y";
  59.  
  60.             PointPairList list1 = new PointPairList(); // puvodni funkce
  61.             PointPairList list2 = new PointPairList(); // aproximace (obdelniky)
  62.  
  63.             double stredObdelniku = spodniHraniceZ + sirkaObdelnikuZ / 2; // stred prvniho obdelniku
  64.             for (int i = 0; i < pocetObdelnikuZ; i++)
  65.             {
  66.                 // pro kazdy obdelnik
  67.                 context.Variables["x"] = stredObdelniku; // dosazeni hodnoty
  68.                 double hodnotaFunkceVeStreduObdelniku = eGeneric.Evaluate(); // hodnota v bode, kde pritona funkce stred obdelnika
  69.                 list1.Add(stredObdelniku, hodnotaFunkceVeStreduObdelniku);
  70.                 list2.Add(stredObdelniku - sirkaObdelnikuZ / 2, hodnotaFunkceVeStreduObdelniku);
  71.                 list2.Add(stredObdelniku + sirkaObdelnikuZ / 2, hodnotaFunkceVeStreduObdelniku);
  72.  
  73.  
  74.                 stredObdelniku += sirkaObdelnikuZ; // stred dalsiho obdelniku
  75.             }
  76.             LineItem myCurve = myPane.AddCurve("Funkce", list1, Color.Red, SymbolType.Circle);
  77.             LineItem myCurve2 = myPane.AddCurve("Aproximace", list2, Color.Blue, SymbolType.None);
  78.             myCurve2.Line.Fill = new Fill(Color.White, Color.Red, 45F);
  79.  
  80.             zgc.AxisChange();
  81.             zgc.RestoreScale(myPane);
  82.  
  83.         }
  84.     }
  85. }
  86.  
  87.  

tak nejak, aby se ten jiny parser dal pouzit zde...

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1580
  • Karma: 52
    • Verze Delphi: 11.3
Re:Parsovani matematickych vyrazu
« Odpověď #2 kdy: 02-10-2017, 10:52:58 »
Možná http://cc.embarcadero.com/item/15974
Sice ho používám, ale pro celkem primitivní záležitosti.

Offline vandrovnik

  • Padawan
  • ******
  • Příspěvků: 1580
  • Karma: 52
    • Verze Delphi: 11.3
Re:Parsovani matematickych vyrazu
« Odpověď #3 kdy: 02-10-2017, 10:56:47 »
Jinak v tom Parser10 - v unitě P10Build jsem měnil jednu drobnost kvůli 64bitové aplikaci.
Původně:
Kód: [Vybrat]
function HackSetLength(var S: String; NewLen: Integer): integer;
type
  PInteger = ^Integer;
begin
  Result := Length(S);
  PInteger(Longint(S)-4)^ := NewLen;
end;
Nově:
Kód: [Vybrat]
function HackSetLength(var S: String; NewLen: Integer): integer;
begin
  Result := Length(S);
  SetLength(s, NewLen);
end;