Interpretar String como um polinomio

3 respostas
D

Existe alguma função no Java que faça com que o conteúdo da String seja tratada como um polinômio quando recebido por uma variável numérica?

Fazer com que isso seja possível:

double x = 0,2;

String polinomio = 3*Math.pow(x,2)-9;

double conta = polinomio;

3 Respostas

M

Usando o motor JavaScript:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class EvalScript {

	public static void main(String[] args) throws Exception {
		ScriptEngineManager factory = new ScriptEngineManager();
		ScriptEngine engine = factory.getEngineByName("JavaScript");

		double x = 0.2;
		String polinomio = "3*Math.pow(" + x + ",2)-9";

		double resultado = (Double) engine.eval(polinomio);
		System.out.println(resultado);
	}

}
D

Vlw pela ajuda, funcionou perfeitamente aqui colocando direto no código a String recebendo o polinômio, no entanto quando eu tentei o mesmo no programa com Interface tive problemas, fiz diversos testes e notei que diferentemente do programa em texto, em que no momento do recebimento do polinômio, já na String o x é substituído por seu valor, com interface isso não ocorre.

private void metodoNewton(double x, int n){
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        String polifx = jTextFx.getText();
        String polifderivada = jTextFderivado.getText();
        polifderivada = (polifderivada.replace("x", (String.valueOf(x))));
        polifx = polifx.replace("x", String.valueOf(x));

        //Coloquei println aqui pra ver o valor dentro, e sem o replace o x continua sendo x, diferentemente de quando coloca a String
        //pra receber diretamente o polinômio, colocando uma função como Math.exp() da forma que eu estou fazendo daria problema
        System.out.println(polifx);
        System.out.println(polifderivada);
        double erro = Double.parseDouble(jTextErro.getText());
        double fx = 0,fderivada = 0;

        

        try{
            fx = (Double) engine.eval(polifx);
            fderivada = (Double) engine.eval(polifderivada);
        } catch (ScriptException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

        double fi = x - fx/fderivada;
        double fabs = Math.abs(fx);
        table.addRow(new Object[] {n,x,fi,fabs});

        if (fabs>erro){
            x = fi;
            metodoNewton(x,n++);
        }
    }

Tentei de várias formas aqui mas só consegui resolver em partes usando .replace, mas em polinômios com função que possua x no nome como por exemplo Math.exp, o x dele também seria substituído o que causaria um problema. Tem alguma outra forma de resolver isso?

M

Você pode usar o replaceAll com uma expressão regular. Isso evitaria tirar o x de onde ele não deveria ser tirado.

Nesse caso é preciso avaliar cuidadosamente quais são os casos em que o x deve ser substituído para montar a expressão regular.

Criado 11 de setembro de 2010
Ultima resposta 13 de set. de 2010
Respostas 3
Participantes 2