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.

有帮助吗?

解决方案

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++;
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top