Equações em java

3 respostas Resolvido
programaçãoandroidjava
C

me ajudem a pensar em uma melhor forma de codificar esta equação. Sou iniciante e não sei como começar a codar equações em java

750=(1-(1+j)^(-10))/j*86

3 Respostas

S

Para fazer exponenciação, utilize o método pow da classe Math.
O operador ^ é para fazer XOR.

C

Obrigado pela dica bro, eu já trabalhava com o método

C
Solucao aceita

Descobri como fazer, irei postar o método aqui pra quem quiser saber como foi resolvido.

Esse daqui acha o cálculo usando o método da bissecção, procurando o j no intervalo de 10-5 até 1. Ele trabalha com BigDecimals arredondando divisões com 11 casas decimais e trabalhando com uma margem de erro de 10-5 no valor bruto do q0 encontrado para aceitar a solução.

Eis o código:

import java.math.BigDecimal;

import java.math.RoundingMode;

class Calculo {

private static final BigDecimal CEM = new BigDecimal(100);
private static final BigDecimal DOIS = new BigDecimal(2);

private static final int PRECISAO_CALCULO = 11;
private static final int PRECISAO_FINAL = 5;

private static final BigDecimal DELTA =
        BigDecimal.ONE.divide(new BigDecimal(10).pow(PRECISAO_FINAL));

private static final BigDecimal financiamento(int n, BigDecimal j, BigDecimal p) {
    BigDecimal a = BigDecimal.ONE.add(j).pow(n);

    BigDecimal b = BigDecimal.ONE.divide(
            a,
            PRECISAO_CALCULO,
            RoundingMode.HALF_EVEN);

    return BigDecimal.ONE
            .subtract(b)
            .multiply(p)
            .divide(j, PRECISAO_CALCULO, RoundingMode.HALF_EVEN);
}

private static final BigDecimal taxaFinanciamento(BigDecimal q0, int n, BigDecimal p) {
    BigDecimal j1 = DELTA;
    BigDecimal j2 = BigDecimal.ONE;
    BigDecimal q1 = financiamento(n, j1, p);
    BigDecimal q2 = financiamento(n, j2, p);
    for (int i = 0; i < 50; i++) {
        if (q1.subtract(q0).abs().compareTo(DELTA) <= 0) return j1;
        if (q2.subtract(q0).abs().compareTo(DELTA) <= 0) return j2;
        BigDecimal j3 = j1.add(j2).divide(DOIS);
        BigDecimal q3 = financiamento(n, j3, p);
        if (q1.subtract(q0).abs().compareTo(q2.subtract(q0).abs()) > 0) {
            q1 = q3;
            j1 = j3;
        } else {
            q2 = q3;
            j2 = j3;
        }
        if (j1.compareTo(j2) > 0) {
            q3 = q1;
            j3 = j1;
            q1 = q2;
            j1 = j2;
            q2 = q3;
            j2 = j3;
        }
    }
    throw new ArithmeticException("Não convergiu: " + q1 + " " + j1 + " " + q2 + " " + j2);
}

public static void main(String[] args) {
    BigDecimal q0 = new BigDecimal(750);
    BigDecimal p = new BigDecimal(86);
    int n = 10;
    BigDecimal j = taxaFinanciamento(q0, n, p);
    System.out.println(j.toPlainString() + " - " + financiamento(n, j, p).toPlainString());
}

}

Eis a saída:

0.025690244208984076976776123046875 - 749.[telefone removido]
Esta saída significa que para um valor j = 2,56902…%, teremos um q0 = 749,99999…

Criado 4 de novembro de 2017
Ultima resposta 4 de nov. de 2017
Respostas 3
Participantes 2