Portál AbcLinuxu, 2. listopadu 2025 06:55
1) Kdyz A = 10, tak B = 2 2) Kdyz A = 20, tak B = 0.3Kolik bude B, kdyz A bude nekde mezi temi 10 a 20? B klesa linearne, mezi 2 a 0.3 je primka. Takze napr. GnuPlot mi vykresli graf, ale neukaze vzorec vypoctu. Nevedeli byste nekdo, co je toto za vypocet? Kdyztak predem diky za pripadne tipy.
Řešení dotazu:
if A1/B1=5 && A2/B2=9 then An/Bn=?
B = -0,17 * A + 3,7
if A1/B1=5 && A2/B2=9 then An/Bn=?
if 10/2 && 20/0.3 then 13.7/?dava to nejaky smysl? Myslim jako vypocet, ne jako programovani, to je jen pseudokod.
2 = 10x + y ? = 13.8x + y 0,3 = 20x + y
7 = 5000x + y ? = 5850x + y 0,01 = 6700x + y
1) Kdyz A = 10, tak B = 2 2) Kdyz A = 20, tak B = 0,3prepiseme
1) Kdyz X = 10, tak Y = 2 2) Kdyz X = 20, tak Y = 0,3Zavislost nech je linearna (priamka), Ale daj obrazok grafu, z neho sa da urcit, aka je to funkcia (linerarna, exponencionalna, …) Ak priamka:
Y = A * X + Btak pre dve zavisle hodnoty rovnakej funkcie bude vseobecne:
Y1 = A * X1 + B Y2 = A * X2 + BDosadime hodnoty:
2=A*10+B 0,3=A*20+BA riesime sustavu rovnic s dvoma neznamymi (matematika),
2=10*A+B 0,3=20*A+BPouzijeme scitaciu metodu
2 = 10 * A + B 0,3 = 20 * A + B / *(-1) --------------------------- 2 = 10 * A + B -0,3 = (-20) * A + B (scitame riadky) -0,7 = (-10) * A + B / *(-1) 0,7 = 10 * A A = 0,07 A dosadime do 1, rovnice zo zadanie: 2 = 10 * A + B 2 = 0,07 * 10 + B 2 = 0,7 + B / -0,7 B = 2 - 0,7 B = 1,3Dostali sme:
A = 0,07 B = 1,3Vysledna zavislost je:
Y = 0,7 * X + 1,3
// y = K1 * x + K2 - rovnica priamky float x1,x2,x3,y1,y2,y3,K1,K2; x1 = 10; // x-ova suradnica bodu 1 y1 = 2; // y-ova suradnica bodu 1 x2 = 20; // x-ova suradnica bodu 2 y2 = 0.3; // y-ova suradnica bodu 2 // Vypocet K1 a K2: K1 = (y2-y1)/(x2-x1); K2 = y1 - K1 * x1; x3 = 14.5; // x-ova suradnica bodu 3 // Neznama suradnica y bodu 3: y3 = K1 * x3 + K2;
2.000000 = -0.170000 * 10.000000 + 3.700000 3.649000 = -0.170000 * 0.300000 + 3.700000Kod overaci:
#include <stdio.h>
int main()
{
float x1,x2,x3,y1,y2,y3,K1,K2;
x1 = 10; // x-ova suradnica bodu 1
y1 = 2; // y-ova suradnica bodu 1
x2 = 20; // x-ova suradnica bodu 2
y2 = 0.3; // y-ova suradnica bodu 2
// Vypocet K1 a K2:
K1 = (y2-y1)/(x2-x1);
K2 = y1 - K1 * x1;
x3 = 14.5; // x-ova suradnica bodu 3
// Neznama suradnica y bodu 3:
y3 = K1 * x3 + K2;
x3=10;
y3= K1 * x3 + K2;
printf("%f = %f * %f + %f\n", y3, K1, x3, K2);
x3=0.3;
y3= K1 * x3 + K2;
printf("%f = %f * %f + %f\n", y3, K1, x3, K2);
return 0;
}
#include <stdio.h>
int main()
{
float x1,x2,x3,y1,y2,y3,K1,K2;
x1 = 10; // x-ova suradnica bodu 1
y1 = 2; // y-ova suradnica bodu 1
x2 = 20; // x-ova suradnica bodu 2
y2 = 0.3; // y-ova suradnica bodu 2
// Vypocet K1 a K2:
K1 = (y2-y1)/(x2-x1);
K2 = y1 - K1 * x1;
x3 = 14.5; // x-ova suradnica bodu 3
// Neznama suradnica y bodu 3:
y3 = K1 * x3 + K2;
x3=10;
y3= K1 * x3 + K2;
printf("%f = %f * %f + %f\n", y3, K1, x3, K2);
x3=20;
y3= K1 * x3 + K2;
printf("%f = %f * %f + %f\n", y3, K1, x3, K2);
return 0;
}
linsolve([10*x + b - 2, 20*x + b - 0.3], (x, b)), kde x, b jsou importované symboly. Takže pak prostě
def fce(x): return -0.17*x + 3.7A odkud plyne předpoklad lineární závislosti? Je jasné, že Gnuplot propojí dva body přímkou. Čím jiným? Nekonečným počtem křivek? Má ta úloha opravdu lineární vztah ve svém základu?
Načež soused mě poučil, že kdyby tu ty hory nebyly, tak Slunce nemá kam zapadnout a je pořád světlo.Ale vždyť to je pravda, kdyby tady nebyla ta [neprůhledná] země pod tebou, tak vidíme Slunce i v noci -- zespodu.
10*x_1 +x_2 = 2 20*x_2 + x_2 = 0,3,což zobecníme (to chceš, jak jsem pochopil) a přepíšeme to do tvaru
a_11*x_1 + a_12*x_2 = b_1 a_21*x_1 + a_22*x_2 = b_2.Ve tvém případě je
a_11 = 10, a_12 = 1, a_21 = 20, a_22 = 1, že ano. Nyní se zachováme jako dospělí lidé a tuto soustavu zapíšeme v maticovém tvaru:
| a_11 a_12 | |x_1| |b_1| | | | | = | | | a_21 a_22 | |x_2| |b_2|Přesuneme se někdy do roku 1750 ;) a použijeme tzv. Cramerovo pravidlo, které říká, že pro naši hledanou
x_i platí
det A_i
x_i = ---------,
det A
kde det A je determinant matice soustavy a det A_i je determinant téže matice, ovšem nahradíme-li i-tý sloupec maticí pravých stran, tj. například
| b_1 a_12 |
det A_1 = det | |.
| b_2 a_22 |
Determinant matice "2x2" vypočteš jako det A = a_11*a_22 - a_21*a_12, takže jde o rozdíl součinů diagonál v naznačeném směru. Samozřejmě platí, že determinant soustavy nesmí být nulový (matice soustavy musí být regulární).
Zcela stejně pak pro det A_1 a též det A_2 máš
| b_1 a_12 |
det A_1 = det | | = b_1*a_22 - b_2*a_12,
| b_2 a_22 |
| a_11 b_1 |
det A_2 = det | | = a_11*b_2 - a_21*b_1.
| a_21 b_2 |
No a teď už můžeš spočítat x_1, x_2, takže
det A_1 b_1*a_22 - b_2*a_12
x_1 = --------- = -----------------------
det A a_11*a_22 - a_21*a_12
det A_2 a_11*b_2 - a_21*b_1
x_2 = --------- = -----------------------
det A a_11*a_22 - a_21*a_12
A to je celý algoritmus, který potřebuješ.
Můžeme si zkusit dosadit tvé konkrétní numerické vstupy, pak
2*1 - 0,3*1 1,7
x_ 1 = ----------- = --- = -0,17,
10*1 - 20*1 -10
10*0,3 - 20*2 3 - 40 -37
x_2 = --------------- = ------ = ----- = 3,7
-10 -10 -10
Takže máme řešení y(x) = a*x + b = -0,17 + 3,7.
Pro tvůj konkrétní problém, kdy máš pořád a_12 = a_22 = 1, řešení zdegeneruje na jednodušší formu
det A_1 b_1 - b_2
x_1 = --------- = -------------
det A a_11 - a_21
det A_2 a_11*b_2 - a_21*b_1
x_2 = --------- = --------------------
det A a_11 - a_21
A výsledný kód by byl zhruba něco jako
def najdi_rovnici(a_1, a_2, b_1, b_2):
det_A = float(a_1 - a_2)
det_A_1 = b_1 - b_2
det_A_2 = a_1*b_2 - a_2*b_1
x_1 = det_A_1/det_A
x_2 = det_A_2/det_A
print 'y(x) := %s*x + %s' % (x_1, x_2)
return None
# nebo třeba
# return x_1, x_2
Když v Pythonu takový kód spustím pro tvé zadání, dostanu
>>> najdi_rovnici(10, 20, 2, 0.3) y(x) := -0.17*x + 3.7Jestli jsem někde udělal chybu, sorráč, nejsem účetní. Ale princip bys měl z toho pochopit.
from numpy import linalg # Matice A, matice B ma = [[10, 1], [20, 1]] mb = [2, 0.3] res = linalg.solve(ma, mb) print(res) # Vrací [ -0.17 3.7 ] # Výpočet trvá pár mikrosekund.Analytická metoda se spočte v řádu nanosekund. Ale podobně rychle to jde i v Julii:
A = [10 1; 20 1]
b = [2; 0.3]
A \ b
# Vrací
# 2-element Vector{Float64}:
# -0.17
# 3.7
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.