Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Transferuri instant intre bancile...

player video

Carefur Act for good

Parcare gratis in Bucuresti pentr...
 Rovinieta prin SMS pentru masina ...

Viteza mica Usb 3.2 gen.1 header

Cerificat atestare fiscala pentru...

Schimbare destinatie imobil din l...
 Dorsalgie

Recomandare brand cheie dinamomet...

Divorț la notar

Vechime vs km reali
 Android 12 : "Yahoo Mail s-a ...

Bloc Favorit cu RS2

Ce extractor audio (analogic) pen...

Cine suporta cheltuielile de jude...
 

[Oldies but goodies] Cum ai rezolva & afisa solutiile unei ecuatii de gradul 2 (numere reale) in 2019?

* - - - - 1 votes
  • Please log in to reply
24 replies to this topic

#1
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,114
  • Înscris: 24.02.2007
Mai toti am scris candva un program ce rezolva o ecuatie de gradul 2.

Cum l-ai scrie insa elegant in 2019 profitand de facilitatiile limbajelor moderne? In special cum tratezi diversele cazuri?

(rezolvarea si afisarea sa fie in functii/metode/whatever diferite)

Edited by dani.user, 05 December 2019 - 19:46.


#2
maccip

maccip

    45 ani

  • Grup: Senior Members
  • Posts: 32,896
  • Înscris: 06.01.2007
Depinde mult de context. Nu exista o implementare cea mai buna.
Poti sa arunci exceptii cand delta<0 sau poti returna NaN.
Poti returna valorile sau poti transfera ca si argumente de tip out, (referinta), depinde de limbaj, C# permite argumente out.
Poti returna sub forma de pereche anonima, lista, iterator, depinde de context, de limbaj.
Poti folosi template over niste elemente de tip float, double sau in general alte elemente ale unui inel comutativ, daca functia respectiva va fi utilizata intr-un context functional sau o biblioteca matematica.
Pentru o utilizare inttr-un hardware minimalist, poate doresti sa folosesti pointeri la memorie ca si argumente pentru radacini, tot asa, NaN sa fie in cazul in care delta<0. Depinde de platforma pentru care se implementeaza, throw-try-catch poa sa fie prea lent.
Apoi mai sunt situatii in care se stie aprioric ca solutiile sunt reale si distincte, caz in care nu mai trebuie facute niste teste suplimentare, depinde de context, tot asa. Nu-mi vine acum in minte un exemplu, insa de exemplu la algoritmul Cholesky implementat pentru matrici reale, pozitiv definite(rezultate din operatia de conjugare), nu mai e nevoie de verificari suplimentare ale argumentului la sqrt(), Inversarile de matrice sunt un mare consumator de resurse in anumite software de statistica, poate e mai bine sa nu faci acele verificari cand nu se impune, te bazezi pe algebra implicita a procesorului ca sa castigi timp.

#3
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,439
  • Înscris: 06.01.2010

Quote

NaN sa fie in cazul in care delta<0
Da' numerele complexe ce-au? :)

#4
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,295
  • Înscris: 10.08.2005
pai n-au reprezentare implicita, e cu "workaround"

#5
maccip

maccip

    45 ani

  • Grup: Senior Members
  • Posts: 32,896
  • Înscris: 06.01.2007

View Postparabellum, on 05 decembrie 2019 - 23:17, said:

Da' numerele complexe ce-au? Posted Image
Sunt mai simple deoarece nu necesita tratarea exceptiilor.
:)

#6
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,439
  • Înscris: 06.01.2010

Quote

pai n-au reprezentare implicita, e cu "workaround"
In C++ exista std::complex.

Nu intotdeauna ai nevoie de rezolvarea 'ca la scoala'. Exemplu concret: https://github.com/a...mics/Particle.h (functia CollisionTime).
E vorba de doua bile care se pot ciocni (sau nu). Ecuatie de gradul doi, cand nu se ciocnesc e cazul cu radacinile complexe si e neinteresant, etc. Intereseaza doar cazul in care exista doua solutii si doar prima solutie e necesara (daca e in viitor, nu in trecut), a doua fiind ne-fizica.

Edited by parabellum, 06 December 2019 - 11:25.


#7
MartinAdelberg

MartinAdelberg

    Member

  • Grup: Members
  • Posts: 866
  • Înscris: 23.08.2019

View Postdani.user, on 05 decembrie 2019 - 19:45, said:

Mai toti am scris candva un program ce rezolva o ecuatie de gradul 2.

Cum l-ai scrie insa elegant in 2019 profitand de facilitatiile limbajelor moderne? In special cum tratezi diversele cazuri?

(rezolvarea si afisarea sa fie in functii/metode/whatever diferite)
python 3.x
import math
print("introdu coeficientii ec de gradul 2:")
(a, b, c) = (int(input("a=")), int(input("b=")), int(input("c=")))
delta = b*b - 4 * a * c
if delta > 0:
	(x1, x2) = ((-b - math.sqrt(delta))/(2*a), (-b + math.sqrt(delta))/(2*a))
elif delta == 0:
	(x1, x2) = (-b/(2*a), -b/(2*a))
else:
	(real,  imaginar) = -b/(2*a), math.sqrt(-1 * delta)/(2*a)
	(x1, x2) = ("{0} - {1}*i".format(real, imaginar),  "{0} + {1}*i".format(real, imaginar))
print("Solutiile sunt: x1 = {0} si x2 = {1} ".format(x1, x2))



#8
MartinAdelberg

MartinAdelberg

    Member

  • Grup: Members
  • Posts: 866
  • Înscris: 23.08.2019

View Postmaccip, on 05 decembrie 2019 - 21:37, said:

Depinde mult de context. Nu exista o implementare cea mai buna.
Poti sa arunci exceptii cand delta<0 sau poti returna NaN.
de ce sa faca asta cand ecuatia de gradul 2 are intotdeauna solutii. Ca nu poti fii si solutii reale asta este alta problema si este un caz particular.

Edited by MartinAdelberg, 15 December 2019 - 16:32.


#9
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,295
  • Înscris: 10.08.2005
Tu de ce tot calculezi valori invariante?

#10
MartinAdelberg

MartinAdelberg

    Member

  • Grup: Members
  • Posts: 866
  • Înscris: 23.08.2019
din mai mult motive:
1.imi place scriere cu tupluri gen, (x1, x2)
2. n-am vrut sa scriu doua linii pt acest lucru:
solutie_unica = -b /(2 * a)
(x1, x2) =  (solutie_unica, solutie_unica)

3.nu-mi place scrierea :
 x1 = x2 = -b/(2*a)
, pe motiv ca-mi place punctul 1.

#11
MartinAdelberg

MartinAdelberg

    Member

  • Grup: Members
  • Posts: 866
  • Înscris: 23.08.2019
de asemeni ar mai trebui sa pun si verificare ca  "a <> 0", astfel incat sa nu-mi dea eroarea de division by zero la numitor.
dar acolo am scris "core-ul"

#12
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,439
  • Înscris: 06.01.2010

Quote

de ce sa faca asta cand ecuatia de gradul 2 are intotdeauna solutii. Ca nu poti fii si solutii reale asta este alta problema si este un caz particular.
Pentru ca solutiile nu sunt relevante intotdeauna cand sunt complexe. De-aia. Pentru ca e stupid sa calculezi doua solutii cand tu ai nevoie de doar una, chiar cand ai solutii reale. Cazul concret indicat de mine. Unde chiar nu intereseaza solutiile ne-fizice (sau chiar anti-fizice).

In cazul ala particular poate ca n-o sa ti se para mare lucru, dar in alte situatii trecerea de la calcule cu complex la double are un impact semnificativ.

#13
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,295
  • Înscris: 10.08.2005

View PostMartinAdelberg, on 15 decembrie 2019 - 20:14, said:

de asemeni ar mai trebui sa pun si verificare ca  "a <> 0", astfel incat sa nu-mi dea eroarea de division by zero la numitor.
dar acolo am scris "core-ul"
pai daca este zero atunci nu mai este ecuatie de grad 2, dar tot putem da o solutie pentru x.

#14
MartinAdelberg

MartinAdelberg

    Member

  • Grup: Members
  • Posts: 866
  • Înscris: 23.08.2019
pai cam da, se poate dar enuntul era legatde ecuatia de gradul 2.

View Postparabellum, on 16 decembrie 2019 - 15:14, said:

Pentru ca solutiile nu sunt relevante intotdeauna cand sunt complexe. De-aia. Pentru ca e stupid sa calculezi doua solutii cand tu ai nevoie de doar una, chiar cand ai solutii reale. Cazul concret indicat de mine. Unde chiar nu intereseaza solutiile ne-fizice (sau chiar anti-fizice).

In cazul ala particular poate ca n-o sa ti se para mare lucru, dar in alte situatii trecerea de la calcule cu complex la double are un impact semnificativ.
Chestia este ca dpdv matematic multimea numerelor complexe include multtimea numerelor reale

Edited by MartinAdelberg, 17 December 2019 - 07:22.


#15
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,439
  • Înscris: 06.01.2010
Aha. Si pentru 'dpdv'-ul matematic vom face anti-fizica, chiar si cand asta inseamna o penalizare la performanta.

#16
MartinAdelberg

MartinAdelberg

    Member

  • Grup: Members
  • Posts: 866
  • Înscris: 23.08.2019

1. ce penalizare de performanta la o ecuatie de gradul 2 ?

2. matematica este matematica, cat despre anti-fizica un numar real  este un numar complex cu partea imaginara zero.


Edited by MartinAdelberg, 17 December 2019 - 23:24.


#17
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,295
  • Înscris: 10.08.2005
inapoi la cod va rog

#18
parabellum

parabellum

    Senior Member

  • Grup: Senior Members
  • Posts: 2,439
  • Înscris: 06.01.2010

Quote

1. ce penalizare de performanta la o ecuatie de gradul 2 ?
In general, folosind numere complexe in loc de reale. Curios lucru, tocmai am lecturat un articol unde autorii par la modul serios a fi ingrijorati de asta, rezervand o parte pentru eliminarea numerelor complexe din calcule (pentru curiosi: Energy Bands in Periodic Lattices - Green's Function Method, F. S. Ham & B. Segall).

Revenind la exemplul mentionat mai sus, imaginea atasata contine un screenshot cu 40000 de sfere care se ciocnesc.
Nu mi-a pasat de performata prea mult, dar si asa programul e destul de capabil.

Cu sectoring si cu ceva atentie la performanta, foarte posibil sa se poata merge cu un ordin de marime mai sus.

Ar fi de-a dreptul stupid sa calculezi solutii complexe la ciocniri, cand acelea nu se realizeaza in realitate. La fel de stupid ar fi sa folosesti numere complexe in loc de cele reale. Sper ca esti capabil singur sa afli cam care e penalizarea de performanta la adunari/scaderi sau inmultiri/impartiri. Cu atat mai mult la necesarul de memorie suplimentara.

Quote

2. matematica este matematica, cat despre anti-fizica un numar real  este un numar complex cu partea imaginara zero.
Iar fizica e fizica. Spre deosebire de matematica, vrea sa se refere la realitate, nu la inchipuirile din capul unora.
Iar fizica aia zice ca e stupid sa pastrezi zero-urile alea in memorie si sa mai si faci calcule cu ele, pentru ca asa zice matematica (adica tu, iar tu de fapt nu esti matematica).

Dar daca aplici 'logica' aia de tip java-ista, care zice ca nu conteaza ca programul foloseste 1TByte de memorie cand ar putea folosit 1KByte, sau ca rupe mii de procesoare cand ar putea rula eficient chiar pe abac Posted Image, voi puteti sa folositi https://en.wikipedia...wiki/Quaternion chiar daca nu trebuie. Sau de ce nu, direct https://en.wikipedia.org/wiki/Octonion Si daca mai sapi pe acolo, poate descoperi ceva chiar mai ineficient. Pana la urma, daca vrei cu adevarat, poti sa asociezi chiar 10^23 de zero-uri la fiecare numar real.

La urmatorul mare meeting sa nu uiti sa propui sa bagati refactoring la proiecte ca sa inlocuiti numerele alea reale. Chiar e greu de inteles de ce mai exista tipul ala in java cand puteau sa foloseasca tipul 'bloatware' direct.

Attached Files


Edited by parabellum, 18 December 2019 - 12:05.


Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate