Java Polynômes

Fermé
L3arning Messages postés 5 Date d'inscription vendredi 28 octobre 2022 Statut Membre Dernière intervention 1 novembre 2022 - 31 oct. 2022 à 21:54
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 1 nov. 2022 à 07:23

Bonjour, 

Je dois concevoir un programme java qui récupère des polynômes de n'importe quelle puissance sous la forme : 5.x^5+4.x^3+20.x^2 (c'est un exemple)

Par la suite je dois faire la la moyenne de ces polynômes pour une valeur de x.

Je voulais donc split une première fois par "+", une deuxième fois par "." et une troisième fois avec ^. Sauf que voila je ne vois pas comment split plusieurs fois puis faire le calcul de mes polynômes.

import java.util.*;
import java.util.Scanner;

public class Polynomial {
    private static String polynome = "5.x^5+4.x^3+20.x^2";
    static String Print(){
       return polynome;
    }
    static void setPolynome(String poly){
        polynome = poly;
    }

    static float compute(float x){

        String[] list_1 = polynome.split("\\+"); // so now we have : 5.x^5 4.x^3 20.x^2 x 1

        for (String new_list : list_1)
            System.out.println(new_list);
        System.out.println("list_1 length : " + list_1.length);


        for(int i=0; i < list_1.length; i++) {
            try{
                String[] split_1 = list_1[i].split("\\.");
                for (int j=0; j< split_1.length; j++)
                {
                    System.out.println(split_1[j]);
                }
            }
            catch (Exception e){
                System.out.println("Problem");
            }
        }
        float y = 1;
        return y;

    }}

La valeur de retour est y = 1 de manière à pouvoir tester la méthode. Merci à celui qui prendra le temps de m'aider.

A voir également:

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
31 oct. 2022 à 22:47

Bonjour,

Tu peux faire ton calcul récursivement en appelant la même méthode sur des String de plus en plus petit auxquels tu appliqueras de moins en moins de calculs.

Exemple non testé (je code sur mon téléphone)

public double eval(String polynome, double x) {
    System.out.println(polynome);
    String[] plus = polynome.split("+");
    if (plus.length > 1) {
        double result = 0;
        for (String s : plus)
            result += éval(s, x);
        return result;
    }
    String[] point = polynome.split("\\.");
    if (point.length > 1) {
        double result = 1;
        for (String s : point)
            result *= eval(s, x);
        return result;
    }
    String[] pow = polynome.split("\\^");
    if (pow.length > 1) {
        return Math.pow(x, eval(pow[1]));
    }
    return Double.parseDouble(polynome);
}

0
L3arning Messages postés 5 Date d'inscription vendredi 28 octobre 2022 Statut Membre Dernière intervention 1 novembre 2022
1 nov. 2022 à 00:11

Je crois que le programme marche mais moi je veux passer de :

etape 1 =  5.x^5+4.x^3+20.x^2+x+1

split par + = 5.x^5 4.x^3 20.x^2 x 1

split par . = 5 x^5 4 x^3 20 x^2 x 1

split par ^ = ...

Et après je dois trouvé un moyen de calculer le polynôme de n'importe quel ordre. Merci.

0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > L3arning Messages postés 5 Date d'inscription vendredi 28 octobre 2022 Statut Membre Dernière intervention 1 novembre 2022
1 nov. 2022 à 07:23

C'est bien de vouloir tout spliter, mais si derrière tu n'arrives pas à faire ton calcul ça sert à quoi ?

Pour obtenir un résultat il faut remplacer x par sa valeur, or mathématiquement l'opération puissance est prioritaire, puis vient la multiplication et enfin la somme.

Alors certes ton traitement doit faire le cheminement inverse et commencer par le split sur +, mais tu ne pourras pas faire le calcul de la somme tant que tu n'auras pas calculé chacun des termes de la somme.

Donc pour moi l'algorithme devrait plutôt faire comme ça : 

x=2

input : "5.x^5+4.x^3"
split : ["5.x^5", "4.x^3"]

input1 : "5.x^5"
split1 : ["5", "x^5"]

input11 : "5"
parse11: 5

input12 : "x^5"
split12 : ["x", "5"]
x : 2
parse122 : 5
pow12: 2^5=32

output1 : 5*32=160

input2 : "4.x^3"
split2 : ["4", "x^3"]

input21 : "4"
parse21: 4

input22 : "x^3"
split22 : ["x", "3"]
x : 2
parse222 : 3
pow22: 2^3=8

output2 : 4*8=32

output : 160+32=192

On ne fait pas tous les splits en premier, mais on va droit au calcul, si bien que lorsque l'on commence le split de "4.x^3" on connaît déjà la valeur de "5.x^5" pour pouvoir les sommer avant d'évaluer "20.x^2" etc.

Remarque : dans le cas général il faudrait aussi penser à gérer les valeurs négatives d'un polynôme.

0
PierrotLeFou
1 nov. 2022 à 00:34

Je ne connais pas suffisamment Java pour te donner une réponse précise, mais j'ai déjà fait des choses semblables en Python.
C'est OK de faire des split sur le "+" au départ. Mais tu dois faire un split sur "." sur "chaque" terme de ton polynôme.
Et faire un split sur "^" sur chaque deuxième élément de tes termes.
En fait, puisque tu n'as en principe qu'une seule variable ("x"), tu n'en a pas vraiment besoin.
Tu auras une liste de tuples (coefficient, exposant), qqui s'évalue normalement assez facilement.

0