Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Ahoj, řeším problém, kde má program počítat x z rovnice když zadám pravou stranu. X má být v intervalu <0.1>. A pravá strana se zadává ručně z intervalu <-117,679>. Nefunguje mi to pro -117. Nevíte prosím jak to udělat? výsledné x má být s přesností na 4 desetinná místa.
Scanner sc = new Scanner(System.in);
System.out.println("Program pro vypocet x z rovnice (x+3)^5 - 15*(x-2)^3 - 30*(x-4)^2 = pravaStrana");
System.out.println("Zadejte pravou stranu rovnice z intervalu <-117,679>:");
int pravaStrana = sc.nextInt();
double x=0;
double vysledneX = 0;
for (double i=0.00001; i<1; i+=0.00001)
{
if (Math.pow(x + 3, 5) - 15 * Math.pow(x - 2, 3) - 30 * Math.pow(x - 4, 2)<pravaStrana){
x = i;}}
vysledneX = x;
System.out.println("---Vysledky---");
System.out.println("Resenim rovnice");
System.out.println("(x+3)^5 - 15*(x-2)^3 - 30*(x-4)^2 =" +pravaStrana);
System.out.println("je:");
System.out.printf(Locale.US, "%6.4f%n", vysledneX);
}
}Offline
Zdravím, Pascal je pro mě španělská vesnice, ale myslím, že má být tento řádek takto:
for (double i=0; i<1; i+=0.00001)
a nebo předefinování x:
double x=-0.00001;
Poznámka:
Nebyla by efektivnější Newtonova metoda?
Kód v maximě:
NajdiX(ps):=block([x:0,z:1],
while is(abs(x-z)>1e-13) do (
z: x,
x: float(x-((x+3)^5-15*(x-2)^3-30*(x-4)^2-ps)/(5*(x+3)^4-60*(x-4)-45*(x-2)^2))
),x
);Funkce NajdiX s parametrem ps - hodnota pravé strany rovnice,
opakuje dokud se výsledek neliší od skutečnosti o více jak 1e-13,
výsledek je vypočítaný maximálně na šestý pokus.
Offline
Já Javu vidím prvně teď, ale zkusím to předělat podle tvýho.
Scanner sc = new Scanner(System.in);
System.out.println("Program pro vypocet x z rovnice (x+3)^5 - 15*(x-2)^3 - 30*(x-4)^2 = pravaStrana");
System.out.println("Zadejte pravou stranu rovnice z intervalu <-117,679>:");
int pravaStrana = sc.nextInt();
double x=0;
double vysledneX = 0;
double ps = pravaStrana; /* funkce pow potřebuje parametry jako double, tady je to potřeba asi převést, neumím to */
double z = 1;
while (Math.abs(x-z) > 1e-13)
{
z = x;
x = x-(Math.pow((x+3),5)-15*Math.pow((x-2),3)-30*Math.pow((x-4),2)-ps)/(5*Math.pow((x+3),4)-60*(x-4)-45*Math.pow((x-2),2));
}
/* Javu neumím, napsal jsem to podle tvýho kódu, jestli to bude chodit neručím, snad jsem udělal málo chyb :-) */
vysledneX = x;
System.out.println("---Vysledky---");
System.out.println("Resenim rovnice");
System.out.println("(x+3)^5 - 15*(x-2)^3 - 30*(x-4)^2 =" +pravaStrana);
System.out.println("je:");
System.out.printf(Locale.US, "%6.4f%n", vysledneX);
}
}Funkce pow potřebuje parametry double, nevím jestli Java si to umí automaticky převést, nebo se to musí ručně.
Taky nevím, jestli se to Math. musí psát před pow, nebo ne.
1e-13 je vlastně 10^-13, taky nevím jestli v Javě je to správně zapsáno.
Dalo by se to napsat i jako funkce:
public static double hledej(double ps){
/* ps - obsahuje pravou stranu rovnice, musí se zadat */
/* x - inicializovaná proměnná na nulu, po ukončení smyčky vrátí výsledek */
/* z - pomocná proměnná, pokud bude absolutní rozdíl mezi [x] a [z] větší jak [1e-13] pak se stále provádí smyčka while */
double x = 0;
double z = 1;
while (Math.abs(x-z) > 1e-13)
{
z = x;
x = x-(Math.pow((x+3),5)-15*Math.pow((x-2),3)-30*Math.pow((x-4),2)-ps)/(5*Math.pow((x+3),4)-60*(x-4)-45*Math.pow((x-2),2));
}
return x;
}Možná by to bylo přehlednější.
Offline