Haliho,
a kovetkezo" egyenletrendszert kene megoldani (x es y ismeretlenek, tobbi adott valos sza'm):
4A = A_00 + A_10*x + A_01*y + A_11*x*y
4B = B_00 + B_10*x + B_01*y + B_11*x*y
tobbszor mar felmerult a problema, de valahogy mindig sikerult kikerulni, most mar nem nagyon akarom :]
Szoval erre kene vmi jo megoldas. A gond az, hogy lehet hogy a megoldas nem is egyedi, merthogy ez egy kvadratikus egyenletrendszer. Tovabbi egyszerusites lehet talan, hogy csak a [-1,1]x[-1,1] intervallumokban levo megoldas erdekel, ha van megoldas, de ezen kivul esik, akkor az nem erdekel.
Gyk az alapproblema marha egyszeru", adott egy f:R^2->R^2 fv, de csak egy szabalyos racson, a racspontok koze (bi)linearisan lehet interpolalni, es ezt az f fv-t kene invertalni.
Otlet?
Koszi, A.
- 2243 megtekintés
Hozzászólások
Hi!
Ha nem programba kell, akkor talan a Matlab megoldja. Bar ahogy latom, nem ez a helyzet.
By(t)e
TBS::Antiemes
- A hozzászóláshoz be kell jelentkezni
Nem, sajnos C kodba kene, elegge masszivan (igy is elegge lassan fut le, most fel lesz ezzel vhogy tuningolva, nem az igazi...:/).
Vmi geometriai megoldasa is lehet a dolognak, elvegre a ket egyenlet egy-egy kupszeletet (azonbelulis hiperbolat) ir le, kerdes, hogy ezek hol metszik egymast. Akar 4 metszespont is lehet...
- A hozzászóláshoz be kell jelentkezni
Szamolj vegig egy altalanos esetet kezzel!
4A = A_00 + A_10*x + A_01*y + A_11*x*y
4B = B_00 + B_10*x + B_01*y + B_11*x*y
Szorozzuk vegig ugy, hogy az xy-os tag kiessen, ha kivonjuk egymasbol.
Marad valami C_1=C_2*x+C_3*y alaku, ami visszahelyettesitheto az egyikbe, marad egy masodfoku egyenlet, amit megoldasz a keplettel.
Amikor utana lekodolod, nyilvan le kell kezelni, ha valami 0 (0-val osztas), ha valami kiesne, es emiatt nem oszthatsz le vele, ha A_11 es B_11 is 0, stb.. de ez mar annyit nem bonyolit a dolgon. A kezi parameteres megoldas alapjan nem tunik lehetetlennek lekodolni.
----
-FLOSSzine: Ha 48 óráig Theo lehetnél, mire fordítanád a rendelkezésedre álló időt?
-Nagy Róbert: Úgy viselkednék Theo-val ahogy ő szokott, csak hogy átérezze :)
honlapkészítés
- A hozzászóláshoz be kell jelentkezni
Remélem, jól értem a kérdést. Az A, B, A_ij, B_ij (i, j {0,1}-ben) mind paraméter, ugye?
1. Tegyük fel, A_11 = 0. Akkor az első egyenletből kapsz x és y között egy lineáris összefüggést, amit beteszel a másodikba, és azt megoldod másodfokú egyenletként. (Természetesen mindenhol figyelve, hogy amivel osztanál vagy szoroznál, az nem nulla. Igazából ezt az 1-es pontot is csak azért veszem külön, mert majd A_11-gyel akarok szorozni.)
2. Most inkább azt tegyük fel, hogy B_11 = 0. Ez az 1-es ponttal szimmetrikus.
3. Most azt tegyük fel, hogy A_11 != 0 és B_11 != 0. Ekkor az első egyenletet szorozd meg B_11-gyel, a másodikat pedig A_11-gyel. Így mindkettő végén A_11 * B_11 * x * y fog állni. Az egyikből vond ki a másikat, és kapsz eegy lineáris összefüggést x és y között, amit az eredeti két egyenlet akármelyikébe behelyettesíthetsz, és egy egyváltozós másodfokú egyenletet kapsz.
Figyelj arra, hogy ne ossz nullával, ne szorozz nullával, és hogy a másodfokú egyenletnek lehet 0, 1, 2 (valós) megoldása. Szerintem jó sok külön eseted lesz.
Ha matematikailag megvan a levezetés, akkor elkezdhetsz azon gondolkozni, hogy lebegőpontos ábrázolással milyen sorrendben számolj, hogy a 0-kat "jól" zárd ki, és egyáltalán, meg tudd becsülni és minimalizálni tudd a hibát. (Ne felejtsük el, hogy lebegőpontos ábrázolásnál általában véve nem érvényes az az asszociativitás és disztributivitás, amit a matematikában az alapműveleteknél "megszoktunk".)
A lebegőpontos aritmetikát numerikus analízisben alkalmazott közelítésekre találták ki. Ezért épeszű C programozó addig nem nyúl a lebegőpontos típusokhoz és függvényekhez, amíg nem abszolút elkerülhetetlen.
http://hal.archives-ouvertes.fr/hal-00128124
http://www.lahey.com/float.htm
http://docs.sun.com/source/806-3568/ncg_goldberg.html
http://en.wikipedia.org/wiki/Floating_point
- A hozzászóláshoz be kell jelentkezni
Igen, lebegőpontos műveleteknél figyelni kell a pontosság(haha) adta hibákra. Meg egyenlőségvizsgálatnál az epszilon eltérést is bele kéne venni. Sok, emiatt megbukott numerikus matematika házit láttam már :)
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Nincs ebben semmi különleges. Ha az első egyenletből kifejezem y-t, és behelyettesítem a másodikba, akkor egy sima másodfokú egyenletrendszert kapok. Amit mindenki meg tud már oldani. Az egyedüli nehézség, hogy sok tagból áll az egyenlet, és oda kell figyelni az előjelekre, meg arra, hogy mit mivel szorzunk be.
Írtam egy kis minta Java programot, ami ki tudja számítani a gyököket. Ebben csak a valós megoldásra koncentráltam, arra nem, hogy mi a helyzet nem valós gyökök esetén:
package bilinearis;
public class Main {
static double A = 10;
static double A_00 = 12;
static double A_10 = 5;
static double A_01 = 7;
static double A_11 = 6;
static double B = 4;
static double B_00 = 3;
static double B_10 = 6;
static double B_01 = 3;
static double B_11 = 6;
public static double yCalc(double x) {
return (4*A - A_00 - A_10*x) / (A_01 + A_11*x);
}
public static void main(String[] args) {
double a = A_11*B_10 - A_10*B_11;
double b = A_01*B_10 + A_11*B_00 + 4*A*B_11 -
A_10*B_01 - A_00*B_11 - 4*B*A_11;
double c = A_01*B_00 + 4*A*B_01 - A_00*B_01 - 4*B*A_01;
double gyokAlatt = b*b - 4*a*c;
if (gyokAlatt >= 0 && a != 0) {
double x1 = (-b + Math.sqrt(gyokAlatt)) / 2 / a;
double x2 = (-b - Math.sqrt(gyokAlatt)) / 2 / a;
double y1 = yCalc(x1);
double y2 = yCalc(x2);
System.out.println("x1 = " + x1 + " x2 = " + x2);
System.out.println("y1 = " + y1 + " y2 = " + y2);
// Ellenőrzés x1-re:
System.out.println("4*A = " + 4*A);
double ertek1 = A_00 + A_10*x1 + A_01*y1 + A_11*x1*y1;
System.out.println("A_00 + A_10*x1 + A_01*y1 + A_11*x1*y1 = " + ertek1);
System.out.println("4*B = " + 4*B);
double ertek2 = B_00 + B_10*x1 + B_01*y1 + B_11*x1*y1;
System.out.println("B_00 + B_10*x1 + B_01*y1 + B_11*x1*y1 = " + ertek2);
}
}
}
Ezen konkrét paraméterekkel ezt a megoldást adta a program:
x1 = 0.05964661273109565 x2 = -19.559646612731097
y1 = 3.7649116531827755 y2 = -1.1399116531827742
4*A = 40.0
A_00 + A_10*x1 + A_01*y1 + A_11*x1*y1 = 40.0
4*B = 16.0
B_00 + B_10*x1 + B_01*y1 + B_11*x1*y1 = 15.999999999999993
- A hozzászóláshoz be kell jelentkezni
Koszi, vegul egy ehhez tok hasonlo valamit csinaltam; csak annak a 90%-a esetszetvalasztas lett. A gond az, hogy a bemeneti adathalmaz elegge nagymennyiesegu es "valtozatos", szemleletesen nehezen tudom elkepzelni hogy milyen, igy muszaj volt minden esetre felkeszulni es/vagy a szamitasok meggyorsitasa vegett az interpolacio szempontjabol trivialis eseteket gyorsan kizarni..
A.
- A hozzászóláshoz be kell jelentkezni