Matlab produceert de volgende twee antwoorden zoals je idd verwacht bij het oplossen van iets met de vorm a*x^2 + b*x + c = 0.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
| >> (1-(Cx-Ax)/(Bx-Ax))*Ay + (Cx-Ax)/(Bx-Ax)*By + tan(Alfa)/(Cx-Ex) - Ey
ans =
(1-(Cx-Ax)/(Bx-Ax))*Ay+(Cx-Ax)/(Bx-Ax)*By+tan(Alfa)/(Cx-Ex)-Ey
>> solve(ans,'Cx')
ans =
[ 1/2/(Ay-By)*(-By*Ax-Ey*Bx+Ey*Ax-By*Ex+Ay*Ex+Ay*Bx+
(2*By*Ax*Ey*Bx+2*By*Ax*Ay*Ex-2*By*Ax*Ay*Bx-
2*Ey*Bx*By*Ex+2*Ey*Bx*Ay*Ex+2*Ey*Ax*By*Ex-
2*Ey*Ax*Ay*Ex+2*Ey*Ax*Ay*Bx+2*By*Ex*Ay*Bx+By^2*Ax^2+Ey^2*Bx^2+Ey^2
*Ax^2+By^2*Ex^2+Ay^2*Ex^2+Ay^2*Bx^2-2*By*Ax^2*Ey-2*By^2*Ax*Ex-
2*Ey^2*Bx*Ax-2*Ey*Bx^2*Ay-2*By*Ex^2*Ay-2*Ay^2*Ex*Bx+4*Ay*tan(Alfa)
*Bx+4*By*tan(Alfa)*Ax-4*Ay*tan(Alfa)*Ax-4*By*tan(Alfa)*Bx)^(1/2))]
[ 1/2/(Ay-By)*(-By*Ax-Ey*Bx+Ey*Ax-By*Ex+Ay*Ex+Ay*Bx-
(2*By*Ax*Ey*Bx+2*By*Ax*Ay*Ex-2*By*Ax*Ay*Bx-
2*Ey*Bx*By*Ex+2*Ey*Bx*Ay*Ex+2*Ey*Ax*By*Ex-
2*Ey*Ax*Ay*Ex+2*Ey*Ax*Ay*Bx+2*By*Ex*Ay*Bx+By^2*Ax^2+Ey^2*Bx^2+Ey^2
*Ax^2+By^2*Ex^2+Ay^2*Ex^2+Ay^2*Bx^2-2*By*Ax^2*Ey-2*By^2*Ax*Ex-
2*Ey^2*Bx*Ax-2*Ey*Bx^2*Ay-2*By*Ex^2*Ay-2*Ay^2*Ex*Bx+4*Ay*tan(Alfa)
*Bx+4*By*tan(Alfa)*Ax-4*Ay*tan(Alfa)*Ax-4*By*tan(Alfa)*Bx)^(1/2))]
>> pretty(ans)
[
[1/2 (-By Ax - Ey Bx + Ey Ax - By Ex + Ay Ex + Ay Bx + (2 By Ax Ey Bx
+ 2 By Ax Ay Ex - 2 By Ax Ay Bx - 2 Ey Bx By Ex + 2 Ey Bx Ay Ex
+ 2 Ey Ax By Ex - 2 Ey Ax Ay Ex + 2 Ey Ax Ay Bx + 2 By Ex Ay Bx
2 2 2 2 2 2 2 2 2 2 2 2
+ By Ax + Ey Bx + Ey Ax + By Ex + Ay Ex + Ay Bx
2 2 2 2 2
- 2 By Ax Ey - 2 By Ax Ex - 2 Ey Bx Ax - 2 Ey Bx Ay - 2 By Ex Ay
2
- 2 Ay Ex Bx + 4 Ay tan(Alfa) Bx + 4 By tan(Alfa) Ax
1/2 ]
- 4 Ay tan(Alfa) Ax - 4 By tan(Alfa) Bx) )/(Ay - By)]
[
[1/2 (-By Ax - Ey Bx + Ey Ax - By Ex + Ay Ex + Ay Bx - (2 By Ax Ey Bx
+ 2 By Ax Ay Ex - 2 By Ax Ay Bx - 2 Ey Bx By Ex + 2 Ey Bx Ay Ex
+ 2 Ey Ax By Ex - 2 Ey Ax Ay Ex + 2 Ey Ax Ay Bx + 2 By Ex Ay Bx
2 2 2 2 2 2 2 2 2 2 2 2
+ By Ax + Ey Bx + Ey Ax + By Ex + Ay Ex + Ay Bx
2 2 2 2 2
- 2 By Ax Ey - 2 By Ax Ex - 2 Ey Bx Ax - 2 Ey Bx Ay - 2 By Ex Ay
2
- 2 Ay Ex Bx + 4 Ay tan(Alfa) Bx + 4 By tan(Alfa) Ax
1/2 ]
- 4 Ay tan(Alfa) Ax - 4 By tan(Alfa) Bx) )/(Ay - By)]
>> |
Ik ga me er zelf in dit geval me er niet teveel in verdiepen, maar je kan OOK ITERATIEF tot een oplossing komen. Dit is vaak de enigste algoritmische oplossing voor (schijnbaar) 'niet' oplosbare formules...
voorbeeld:
stel we nemen de (eenvoudige en WEL omkeerbare) vergelijking y=x^2, waarbij OMGEKEERD x is dus ofwel +sqrt(y) of -sqrt(y) is... (maar stel dat weten we nog ff niet)
stel we willen x als functie van y uitrekenen...
Neem bijvoorbeeld y = 9 (x zal dat uiteraard 3 zijn, maar dat weten we alleen maar om dat we de 'omgekeerde' konden uitrekenen)
Ga nu eens het antwoord bepalen volgens een ITERATIEF algoritme:
(hieronder een simplistische variant daarvan om het uit te leggen voor het
probleem van y=x^2, in MatLab code)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| y=9; % PROBEER hier ook eens een onmogelijke y (bijv y=-9), dit zal een oneindige iteratie opleveren,
% zij het niet dat ie na 100 iteraties gestopt wordt
x_it=y; % PROBEER eens x_it = y, maar ook eens x_it = -y (de eerste zal het antwoord x=3 en de ander x=-3 geven!)
x_step=x_it;
e=1;
ep=1;
i=0;
while e>=1e-3
% count iterations
i = i + 1;
% gok een y (hier zou je je eigen formule kunnen hanteren)
y_it = x_it ^ 2;
% wat is het verschil
diff = (y_it - y);
% bereken verder nog de absolute factoriele afwijking (fout)
e = abs(diff / y);
% fout groter geworden?
if e > ep
% inverteer de stap-richting
x_step = -x_step;
else
% halveer stap alleen als richting goed is
x_step = x_step/2;
end
x_it = x_it + x_step;
% sla vorige fout op
ep=e;
% display
disp(['i= ', num2str(i), ' x_it= ', num2str(x_it), ' e =', num2str(e)]);
% stop iteratie indien na 100 iteraties nog geen antwoord is bereikt
if i >= 100
break;
end
end
% eindresultaat van de omgekeerde berekening x=f(y) staat in x voor y=9 in
% dit geval. |
Let op dat dat het antwoord dus afhangt van de initieel gekozen x_it (en uiteraard y, daar dit 'oneindige iteraties' op kan leveren) >> checken dus...
Dit is een eventueel alternatief voor de exacte oplossing die Matlab en de anderen met Maple uitgespuugd hebben... Iteratief oplossingen kunnen in sommige gevallen (lees: in trage embedded systemen/ microcontrollers met trage klokfrequentie, op RISC processoren, zakrekendozen, etc...) sneller zijn dan exacte!!!
[
Voor 6% gewijzigd door
Doineann op 23-07-2004 13:01
]
Reality is merely an illusion, albeit a very persistent one. - Albert Einstein