Question

I am experimenting with the implementation of Integration by parts and am trying to pull out all the possible u and dv pairs from a list of all the things multiplied together. The code provided is my method, except the Function objects have been replaced with strings for readability and so that people could run it out of context.

ArrayList<String> funcObjects = giveList(CALC.MULTIPLY, function);//populate this any way you like

//all the pairs are stored in a matrix
int pairCounter = 0;
String[][] udvPairs = new String[funcObjects.size() * funcObjects.size()][2];
//for (int skip = 0; skip < 1; skip++) {
//commented out for sake of a better solution
for (int i = 0; i < funcObjects.size() - 1; i++) {
    System.out.println("i=" + i);
    //System.out.println(function.size());
    for (int j = 0; j < funcObjects.size() - i; j++) {
        System.out.println("j=" + j);
        CalcObject u = "1";
        CalcObject dv = "1";
        for (int start = j; start <= j + i; start++) {
            //this loop here is what is generating my u.
            //note that it goes in order and therefore cannot
            //account for items that are not next to each other in the list
            //my question is how to add a fix for this
            u = u + " * " + funcObjects.get(start);
        }
        for (int end = 0; end < j; end++) {
            dv = dv + " * " + funcObjects.get(end);
        }
        for (int end = j + i + 1; end < funcObjects.size(); end++) {
            dv = dv + " * " + funcObjects.get(end);
        }

        System.out.println("Pair " + pairCounter + "; u: " + u.toString() + " dv: " + dv.toString());
        udvPairs[pairCounter][0] = u;
        udvPairs[pairCounter][1] = dv;
        pairCounter++;
    }
}

This is my code so far. The combinations it gives me are correct, but it does not give me all the combinations. For example:

x * SIN(x) * COS(x)

i.e. the list passed in being ["x","SIN(x)","COS(x)"]

will give me

i=0  
j=0  
Pair 0; u: x dv: SIN(x) * COS(x)  
j=1   
Pair 1; u: SIN(x) dv: x * COS(x)  
j=2  
Pair 2; u: COS(x) dv: x * SIN(x)  
i=1  
j=0  
Pair 3; u: x * SIN(x) dv: COS(x)  
j=1  
Pair 4; u: SIN(x) * COS(x) dv: x  

It is skipping u: x * COS(x) dv: SIN(x)

So my question is, anyone have an idea how to make it also account for combinations in which the parts are not next to each other? The program is not throwing any errors, I just don't know how to finish implementing what I need.

Thanks.

Was it helpful?

Solution

This is the code to make it work:

ArrayList<String[]> udvPairs = new ArrayList<>();
String[] temp = new String[2];
String notOne = "1";
for (int i = 0; i < funcObjects.size(); i++) {
    notOne = notOne += funcObjects.get(i);
}
temp[0] = "1";
temp[1] = notOne;
udvPairs.add(temp);
temp = new String[2];
temp[1] = "1";
temp[0] = notOne;
udvPairs.add(temp);
for (int i = 0; i < funcObjects.size() - 1; i++) {
    //System.out.println("i=" + i);
    //System.out.println(function.size());
    for (int j = 0; j < funcObjects.size() - i; j++) {
        //System.out.println("j=" + j);
        for (int skip = 0; skip < funcObjects.size() - i - j; skip++) {
            //System.out.println("skip=" + skip);
            String u = "1";
            String dv = "1";
            u += funcObjects.get(j);
            for (int start = j + skip + 1; start <= j + i + skip; start++) {
                u += ufuncObjects.get(start);
            }
            for (int end = 0; end < j; end++) {
                dv += funcObjects.get(end);
            }
            for (int end = j + 1; end < j + skip + 1; end++) {
                dv += funcObjects.get(end);
            }
            for (int end = j + i + 1 + skip; end < funcObjects.size(); end++) {
                dv += funcObjects.get(end);
            }
            //}
            //System.out.println("Pair " + pairCounter + "; u: " + u.toString() + " dv: " + dv.toString());
            temp = new String[2];
            temp[0] = u;
            temp[1] = dv;
            boolean addIt = true;
            for (int x = 0; x < udvPairs.size(); x++) {
                if (udvPairs.get(x)[0].equals(u) && udvPairs.get(x)[1].equals(dv)) {
                    addIt = false;
                    x = udvPairs.size();
                }
            }
            if (addIt) {
                udvPairs.add(temp);
            }
            //pairCounter++;
        }
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top