Przekształcanie wzorów

0

Witam

Z góry przepraszam za ewentualną banalność problemu - jestem początkującym programistą hobbystą (programuje w Delphi).

Powiedzmy że mamy dany wzór:
a=b+c

Zawsze znam dwie zmienne i muszę wyliczyć trzecią

Moje pytanie:
Czy w przypadku powyższego wzoru muszę go przekształcać za każdym razem tj:
a=b+c
b=a-c,
c=a-b
żeby wyliczyć niewiadomą, czy może istnieje jakiś sposób żeby wpisać tylko jeden z tych wzorów i dzięki temu mieć możliwość (podając dwie wartości uzyskać trzecią)
Problem tkwi w tym że mam dziesiątki wzorów z niejednokrotnie kilkunastoma zmiennymi (ale zawsze jest tylko jedna niewiadoma we wzorze) . Może istnieje jakiś gotowy komponent, biblioteka…

0

To, że programujesz akurat w Delphi nie ma tutaj większego znaczenia.

Co do Twojego pytania - napisz proszę jaśniej, o co Ci chodzi. Wyjaśnij krok po kroku ze szczegółami co masz i co chcesz osiągnąć.

Zasadniczo na tym polega programowanie, żeby znaleźć odpowiedni algorytm do rozwiązania problemu. Jeśli udałoby się znaleźć jakieś cechy wspólne/elementy łączące ze sobą poszczególne wzory, to może i dałoby się to jakoś "wspólnie" potraktować - ale Twój opis jest zbyt ogólny, żeby napisać coś więcej.

Daj proszę kilka przykładowych wzorów, z którymi walczysz. Jeśli masz jakieś gotowe fragmenty kodu - wstaw je, łatwiej będzie nam rozmawiać.

Napisz też proszę, po co Ci jest to potrzebne - bo być może w ogóle dałoby się to inaczej potraktować. Jest coś takiego jak problem XY - https://sluzynski.pl/problem-xy-czyli-kiedy-nie-wiemy-o-pytamy/ i może tutaj tez mamy z tym do czynienia.

1

Wolfram Alpha lub cokolwiek do liczenia symbolicznego, ale jak masz to sam wyklepać, to automagicznie się to nie zrobi.

0

Dziękuję za odpowiedzi.
Postaram się krok po kroku ściślej przedstawić zagadnienie.
Użytkownik programu wprowadza poprzez interfejs wartości zmiennych do n-elementowego rekordu rec (wprowadza zawsze n-1 elementów – użytkownik nie zna jednej z tych wartości, a program musi ją wyliczyć).

Var
    rec: record
a1: double;                                                            
u: double;                                                             
c1s: double;                                                           
w1su: double;   
end;  

Zależność pomiędzy powyższymi elementami rekordu opisuje wzór:
a1=arccos((u+w1su)/c1s)

Użytkownik zna wartości tylko trzech z powyższych zmiennych (ale nie wiemy które), dlatego muszę przekształcać wzór dla wszystkich możliwych przypadków jak poniżej:

procedure CountRec;                              //funkcja przeliczająca wszystkie możliwe wartości z wartości dostępnych
begin
//a1 from u and w1su and c1s
           if (IsNaN(rec.a1)) and (not IsNaN(rec.u)) and (not IsNaN(rec.w1su)) and (not IsNaN(rec.c1s)) then     
              begin
                   rec.a1:=RadToDeg(arccos((rec.u+rec.w1su)/rec.c1s));
                   obl:=true;
              end;
//u from a1 and w1su and c1s
           if (IsNaN(rec.u)) and (not IsNaN(rec.a1)) and (not IsNaN(rec.w1su)) and (not IsNaN(rec.c1s)) then     
              begin
                   rec.u:=(cos(DegToRad(rec.a1))*rec.c1s)-rec.w1su;
                   obl:=true;
              end;
//w1su from a1 and u and c1s
           if (IsNaN(rec.w1su)) and (not IsNaN(rec.a1)) and (not IsNaN(rec.u)) and (not IsNaN(rec.c1s)) then                   
begin
                   rec.w1su:=(cos(DegToRad(rec.a1))*rec.c1s)-rec.u;
                   obl:=true;
              end;

//c1s from a1 and u and w1su
           if (IsNaN(rec.c1s)) and (not IsNaN(rec.a1)) and (not IsNaN(rec.u)) and (not IsNaN(rec.w1su)) then     
              begin
                   rec.c1s:=(rec.u+rec.w1su)/(cos((DegToRad(rec.a1))));
                   obl:=true;
              end;
end;

Czy istnieje jakiś sposób aby nie musieć rozpisywać wszystkich przypadków podając tylko jedną zależność pomiędzy zmiennymi?

1

Widzisz - i sprawa już się komplikuje. Zaczynaliśmy od a=b+c w pierwszym poście, a teraz mamy już a1=arccos((u+w1su)/c1s).

Obawiam się, że to o czym myślisz jest raczej niewykonalne, a przynajmniej nie w oparciu o to, co w standardzie jest dostarczone z Delphi. Może są jakieś dodatkowe biblioteki/moduły/narzędzia, które oferują takie możliwości, ale szczerze mówiąc - wątpię (a na pewno mogę stwierdzić, że o żadnym nie słyszałem i niczego takiego nie kojarzę).
Obawiam się, że będziesz musiał każdy taki przypadek sobie rozbić na kilka wariantów i dla każdego z nich odpowiednio przekształcić stosowany wzór - tak, jak to robisz w chwili obecnej.
Dodatkowo, ponieważ jak widzisz - dwa podane przez Ciebie wzory są całkowicie odmienne, więc obawiam się, że ciężko będzie jakoś połączyć ich obsługę i dla każdego z dostępnych wzorów będziesz musiał tworzyć warianty niezależnie od pozostałych.

Ponawiam pytanie - do czego jest Ci to potrzebne? Co to za aplikacja? Co ona ma robić? Bo zakładam, że wyliczanie wartości brakującego parametru funkcji nie jest celem samym w sobie, ale raczej krokiem to osiągnięcia tego, co program ma robić. Dlatego pytam - co to za program i jaki jest jego cel?

0

Hej,
zagadnienie rzeczywiście nie jest proste... przetestuj na początek zagadnienie z załącznika... a potem zobaczymy co dalej... pzdr... :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1