Salut

Tocmai ţi-ai creat cont? Dorești să intri cu dreptul în comunitatea noastră? După ce ai citit regulile, treci pe aici şi spune-ne cine eşti, de unde, cu ce te ocupi, ce te intereseaza şi cum ai dat de noi. În schimb, vei avea parte de o primire călduroasă !

Re: Salut

Postby emi » 08 May 2010, 06:04

Probabil ca trebuie o mica recapitulare (pentru mine cel putin)

Grafice de functii

I. Domeniul de definitie
a) se precizeaza domeniul de definitie rezultat in urma punerii conditiilor de existenta a functiei (exemplu: daca f(x)=1/(2*x-1); atunci x nu poate fi 1/2).
b) se studiaza daca functia este para, impara sau periodica.
c) se determina intersectiile graficului functiei (Gf) cu axele de coordonate:
Gf intersectat cu Ox; afica y=f(x)=0, se calculeaza x;
GF intersectat cu Oy; adica x=0, se afla y=f(0);
d) limitele la capetele intervalelor disjuncte ce apar in domeniul de definitie.
e) calculul asimptotelor:
m = limita(cind x tinde la plus sau minus infinit) de f(x)/x
n = limita(cind x tinde la plus sau minus infinit) de f(x)-mx
rezulta asimptotele y=mx+n;

II. Derivata de ordinul I
a) se calculeaza f'(x) si se precizeaza semnul pe domeniul de definitie determinat anterior
b) se rezolva ecuatia f'(x)=0;
c) se face un tabel de semn pentru f'(x), se precizeaza punctele de extrem si monotonia

III. Derivata de ordinul II
a) se calculeaza f''(x)
b) se rezolva ecuatia f''(x)=0
c) se face un tabel de semn pentru f''(x), se precizeaza punctele de inflexiune, concavitatea, convexitatea


In Java, ca sa desenezi o linie: http://www.java2s.com/Code/Java/2D-Grap ... awline.htm
0,0p / 0 votes
User avatar
emi
Byte
 
Joined: 10 Apr 2010
Status: 18

Re: Salut

Postby hanielamaria » 08 May 2010, 19:37

Va multumesc pentru sfaturi!
0,0p / 0 votes
User avatar
hanielamaria
Bit
 
Joined: 07 May 2010
Status: 0

Re: Salut

Postby emi » 10 May 2010, 16:57

Recomand o carte de matematica: "Tabele si formule matematice" de E. Rogai, de la "EDITURA TEHNICA".
Pe vremea cind eram in scoala, orice prof respectabil avea asa ceva in biblioteca.

La pagina 394-395 gasesti instructiuni mai detaliate pentru reprezentarea grafica a functiilor (capitol 5.8.5)
La pagina 383 gasesti derivatele functiilor elementare.
M-a pus proful din liceu sa imi fac un carnetel cu formule :)) , am acolo un rezumat cu derivatele functiilor elementare.
Operatii cu functii derivabile:
1. (g+h)' = g' + h'; ( lucram cu f(x) = g(x) + h(x) )
2. (a*g)' = a * g'; a este constanta
3. (g*h)' = g' * h + g * h'
4. (g/h)' = (g' * h - h * g') / (h*h)
etc...
probabil le stii, si asta e inceputul pentru un algoritm de derivare simbolica.

Si acum referitor la o fereastra in java (asta e valabil si pentru gwbasic):
in stinga sus ai coordonatele win_x=0, win_y=0;
latimea si lungimea ferestei trebuie sa fie mai mici sau egale cu ale ecranului; sa le numim win_max_x, win_max_y;
sa definim centrul: center_x = (win_max_x - win_x) / 2; center_y = (win_max_y - win_y) /2;
Sa definim functia punct_x_y(x,y) { deseneaza_punct_la(center_x - x, center_y + y) }; deoarece asa sunt coordonatele ecranului si trebuie sa le corectam.
Probabil va trebui sa continui cu functia linie, tot asa, relativ, dar cred ca se intelege ideea.

p.s. un prieten matematician, a reusit sa reprezinte grafic ceva de teoria haosului, in gwbasic, dupa ce i-am explicat cum e cu aceste coordonate de ecran.
Daca sunt necesare lamuriri suplimentare, spuneti.
0,0p / 0 votes
User avatar
emi
Byte
 
Joined: 10 Apr 2010
Status: 18

Re: Salut

Postby Dexter » 10 May 2010, 20:49

Eu pot sa ajut doar cu o implementare în C/C++. Codul e scris puţin în grabă, dar sper că îl va traduce cineva în Java.

Folosind polimorfismul, am plecat de la ideea de expresie. Am considerat că atât operaţiile aritmetice cât şi funcţiile sunt expresii, pe care le-am clasificat în expresii unare, expresii binare, valori constante, variabile şi funcţii (cu un argument sau cu mai multe argumente).

Fiecare expresie poate fi formatată, evaluata (in functie de x), derivata, dar majoritatea acestor operaţii trebuie implementate în clasele "moştenitoare".

Clasele String şi Array nu există; le-am folosit doar în mod simbolic; înlocuiţi-le cu un echivalent.
La evaluarea expresiilor am folosit tipul double; dacă este nevoie, înlocuiţi-l cu alt tip.

  1. /* Expression
  2.  
  3.   Clasa de baza pentru orice tip de expresie/functie/valoare
  4. */
  5.  
  6. class Expression{
  7. public:
  8.     virtual int getPriority()const //prrioritatea operatorilor; folosita doar la afisare
  9.     {
  10.         return 1; //1=prioritatea adunarii
  11.     };
  12.  
  13.     virtual String formatExpression(int parentPriority=1)const=0;
  14.     virtual double evaluate(double x)const=0; //x = parametrul variabil al functiei
  15.     virtual Expression*derrive()const=0;
  16. };
  17.  
  18. /* UnaryExpression
  19.  
  20.  Clasa de baza pentru operatorii aritmetici unari, precum negarea unei valori (-x)
  21. */
  22. class UnaryExpression:public Expression{
  23.     Expression *operand;
  24. public:
  25.     inline UnaryExpression(Expression* op):operand(op){}
  26.     virtual ~UnaryExpression(){if(operand)delete operand;}
  27. };
  28.  
  29. /* BinaryExpression
  30.  
  31.  Clasa de baza pentru operatorii aritmetici binari, precum:
  32.   adunare, scadere, inmultire, impartire, ridicare la putere, etc.
  33. */
  34. class BinaryExpression:public Expression{
  35.     Expression *leftOperand,*rightOperand;
  36. public:
  37.     inline BinaryExpression(Expression *left,Expression *right)
  38.         :leftOperand(left),rightOperand(right){}
  39.  
  40.     virtual ~BinaryExpression()
  41.     {
  42.         if(leftOperand)delete leftOperand;
  43.         if(rightOperand)delete rightOperand;
  44.     }
  45. };
  46.  
  47. /* Function - poate fi vazuta ca o expresie cu orice numar de operanzi*/
  48.  
  49. class Function:public Expression{
  50.     Array<Expression*> arguments; //o lista de parametri ai functiei (0,1, sau mai multi)
  51. public:
  52.     virtual int getPriority()const{return 3;};//prioritatea functiilor
  53.     virtual String getFunctionName()const=0;
  54.     String formatExpression(int parentPriority)const
  55.     {
  56.         //incercam o implementare "default"
  57.         String str="";
  58.        
  59.         if(parentPriority>this->getPriority())
  60.             str+= "(";
  61.        
  62.         str+= getFunctionName() + "(";
  63.        
  64.         str+= arguments[0].formatExpression();
  65.        
  66.         for(int i=1;i<arguments.length;i++)
  67.             str+= "," arguments[i].formatExpression();
  68.             //prioritatea parametrului nu este importanta; este deja separat prin paranteze
  69.         str+= ")";
  70.            
  71.         if(parentPriority>this->getPriority())
  72.             str+= "(";
  73.  
  74.         return str;
  75.     };
  76.  
  77.     virtual ~Function(){ /* Distruge argumentele alocate sub forma de expresii */}
  78. };
  79.  
  80. /* Functie cu un singur parametru - model frecvent intalnit */
  81. class UnaryFunction:public Function{
  82. public:
  83.     inline UnaryFunction(Expression*exp){arguments.push(exp);}
  84. };
  85.  
  86. /* Value - o valoare cunoscuta */
  87.  
  88. class Value:public Expression{
  89.     double value;
  90. public:
  91.     inline Value(double val):value(val){}
  92.    
  93.     String formatExpression(int parentPriority)const{return (String)value;} //conversia la String
  94.     double evaluate(double x){return value;} //independent de argument
  95.     Expression*derrive(){return Value(0);} //independent de valoare
  96. };
  97.  
  98. /* Variable - o necunoscuta (parametrul functiei)*/
  99.  
  100. class Variable:public Expression{
  101.     String variable_name;
  102. public:
  103.     Variable():variable_name("x"){} //alegem "x" ca nume implicit al variabilei
  104.  
  105.     String formatExpression(int parentPriority)const{return variable_name;}
  106.     double evaluate(double x)const{return x;} //x = parametrul functiei
  107.     Expression*derrive()const{return Value(1);} //independent de valoarea variabilei
  108. };



Următoarele clase sunt polimorfice şi din ele trebuie derivate noile clase:

Expression
   |---UnaryExpression
   |---BinaryExpression
   |---Function
   |------UnaryFunction

clasa Expression -- furnizează 4 funcţii polimorfice:
-- int getPriority() -- folosită la formatarea expresiilor; se supraîncarcă pentru a indica propritatea operatorilor
-- String formatExpression([int priority]) -- implementată în clasele descendente, formatează conţinutul expresiilor
-- double evaluate(double) -- implementată în clasele descendente, evaluează expresia în funcţie de variabila x
-- Expression* derrive() -- implementată în clasele descendente, returnează o expresie nouă, prin derivarea expresiei curente

clasa UnaryExpression -- conţine ca variabilă membră, o expresie, pe post de operand unic.

clasa BinaryExpression -- în mod asemănător cu UnaryExpression, conţine 2 expresii, pe post de operanzi. Operaţiile aritmetice de bază pornesc de la această clasă şi implementează funcţiile de formatare, evaluare şi derivare.

clasa Function -- clasa de bază pentru funcţii predefinite. Clasa memorează o listă de argumente şi implementează funcţia de formatare, folosind notaţia tipică a funcţiilor.
Adaugă o nouă funcţie polimorfică: String getFunctionName(), a cărei rol este de a furniza un nume pentru funcţia de formatare.
Rămân 2 funcţii virtuale neimplementate:
-- double evaluate(double)
-- Expression* derrive()

UnaryFunction -- nu aduce nimic nou; doar simplifică uşor scrierea funcţiilor cu un singur argument


Următoarele clase sunt finalizate:

Value (implementează UnaryExpression) -- memorează valori de tip double. Funcţiile de evaluare,formatare şi derivare sunt deja implementate. Ori de câte ori avem nevoie să memorăm o valoare într-o expresie, folosim constructorul: new Value(<valoare>).

Variable (implementează UnaryExpression) -- memorează parametrul x al funcţiei pe care vrem să o evaluăm. Funcţiile de evaluare,formatare şi derivare sunt deja implementate. Când avem nevoie să introducem variabila x într-o expresie, folosim constructorul: new Variable()




Câteva exemple de implementare pentru clasele de mai sus:

Negation (implementează UnaryExpression) -- este negarea algebrică a unei expresii (de forma -x). Clasa memorează expresia ce trebuie negată, iar funcţiile de formatare, evaluare, derivare sunt implementate în funcţie de expresia respectivă.

  1. /* 1. Expresie unara */
  2.  
  3. class Negation:public UnaryExpression{
  4. public:
  5.     Negation(Expression*exp):UnaryExpression(exp){}
  6.    
  7.     int getPriority()const{return 2;} //2=prioritatea inmultirii
  8.     double evaluate(double x)const{return -operand.evaluate(x);}
  9.     Expression*derrive()const{return -operand.derrive();}
  10.    
  11.     String formatExpression(int parentPriority)const
  12.     {return "(-" + operand.formatExpression() + ")";};
  13.    
  14. };

 
Addition, Subtraction, Product (implementează BinaryExpression) -- cei 2 operanzi sunt memoraţi, iar operaţiile de evaluare, formatare şi derivare se fac în funcţie de aceştia.

  1. /* 2. Expresii binare */
  2.  
  3. class Addition:public BinaryExpression{
  4. public:
  5.     inline Addition(Expression *left,Expression *right)
  6.         :BinaryExpression(left,right){}
  7.    
  8.     double evaluate(double x)const
  9.     {
  10.         return leftOperand.evaluate(x)+rightOperand.evaluate(x);
  11.     }
  12.    
  13.     Expression*derrive()const
  14.     {
  15.         return new Addition(
  16.             leftOperand->derrive(),
  17.             rightOperand->derrive()
  18.         );
  19.     }
  20.     String formatExpression(int parentPriority)const
  21.     {
  22.         if(parentPriority > this->getPriority())
  23.             return "("+leftOperand.formatExpression() + " + " + rightOperand.formatExpression()+")";
  24.         else
  25.             return leftOperand.formatExpression() + " + " + rightOperand.formatExpression();
  26.     };
  27. };
  28.  
  29. class Subtraction:public BinaryExpression{
  30. public:
  31.     inline Subtraction(Expression *left,Expression *right)
  32.         :BinaryExpression(left,right){}
  33.    
  34.     double evaluate(double x)const
  35.     {
  36.         return leftOperant.evaluate(x)-rightOperand.evaluate(x);
  37.     }
  38.    
  39.     Expression*derrive()const
  40.     {
  41.         return new Subtraction(
  42.             leftOperand->derrive(),
  43.             rightOperand->derrive()
  44.         );
  45.     }
  46.     String formatExpression(int parentPriority)const
  47.     {
  48.         if(parentPriority > this->getPriority())
  49.             return "("+leftOperand.formatExpression() + " - " + rightOperand.formatExpression()+")";
  50.         else
  51.             return leftOperand.formatExpression() + " - " + rightOperand.formatExpression();
  52.     };
  53. };
  54.  
  55. class Product:public BinaryExpression{
  56. public:
  57.     inline Addition(Expression *left,Expression *right)
  58.         :BinaryExpression(left,right){}
  59.    
  60.     double evaluate(double x)const
  61.     {
  62.         return leftOperant.evaluate(x)+rightOperand.evaluate(x);
  63.     }
  64.    
  65.     Expression*derrive()const
  66.     {
  67.         return new Subtraction(
  68.             new Product(leftOperand->derrive(),rightOperand),
  69.             new Product(leftOperand,rightOperand->derrive())
  70.         );
  71.     }
  72.     String formatExpression(int parentPriority)const
  73.     {
  74.         if(parentPriority > this->getPriority())
  75.             return "("+leftOperand.formatExpression() + " * " + rightOperand.formatExpression()+")";
  76.         else
  77.             return leftOperand.formatExpression() + " * " + rightOperand.formatExpression();
  78.     };
  79. };

 
Sinus, Cosinus (implementează UnaryFunction) -- singurul argument este memorat (aproape) automat în clasa UnaryFunction. Datorită faptului că funcţia de formatare este implementată deja în clasa Function, este suficient ca noi să definim funcţia "getFunctionName".

Funcţia de evaluare apelează funcţia de evaluare a argumentului (argument[0]->evaluate). Rezultatul este folosit ca argument pentru funcţia curentă.

Funcţiile de derivare de mai jos sunt un exemplu de utilizare pentru clasele pe care le-am definit.
 
  1. /* 3. Functii cu un singur argument */
  2.  
  3. class Sinus:public UnaryFunction{
  4. public:
  5.     Sinus(Expression* argument):UnaryFunction(argument){}
  6.    
  7.     String getFunctionName()const{return "sin";}
  8.     double evaluate(double x)const{return sin(argument[0]->evaluate(x));}
  9.     Expression*derrive()const
  10.     {
  11.         return new Product(
  12.             new Cosinus(argument[0]),
  13.             argument[0]->derrive()
  14.         }
  15.     }
  16. };
  17.  
  18. class Cosinus:public UnaryFunction{
  19. public:
  20.     Sinus(Expression* argument):UnaryFunction(argument){}
  21.  
  22.     String getFunctionName()const{return "cos";}
  23.     double evaluate(double x)const{return cos(argument[0]->evaluate(x));}
  24.     Expression*derrive()const
  25.     {
  26.         return new Product(
  27.             new Negation(new Sinus(argument[0])),
  28.             argument[0]->derrive()
  29.         }
  30.     }
  31. };


Mai trebuie implementate câteva funcţii şi câteva operaţii matematice, iar de aici calculatorul se descurcă singur.

Sper că ajută. Codul nu e scris să funcţioneze direct; are mai mult rolul de a explica ideea de implementare.
0,0p / 0 votes
User avatar
Dexter
Word
 
Joined: 04 Jan 2010
Location: Secret Lab
Status: 44.5

Previous

Return to Bine ai venit !

Who is online

Users browsing this forum: No registered users and 0 guests