这个代码是错误示范,只实现了功能但是结构和逻辑有点乱,还存在一些代码复用未做检查,由于时间有限比较仓促,本代码支持常数函数、指数函数和三角函数以及其复合下的表达式求导
例如5* sin(x) **4* sin(x)+4*x--2
,可函数嵌套也可实现函数求导四则运算。
本程序基本功能都已经实现,需要注释的请在下方评论,我看到会进行更新。
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Qiudao {
public String miQiu(String base, int zhi){
// 求导
int newzhi = zhi - 1;
int xi = zhi;
String derivative;
if(newzhi == 1)derivative = xi + "*" + base;
else derivative = xi + "*" + base + "**" + newzhi;
// 返回求导结果
return derivative;
}
public String SanjQiu(String san, String jidi){
if (san.equals("sin")) {
return "cos("+jidi+")";
}
// 如果表达式为余弦函数,则求导为负的正弦函数
else {
return "-sin("+jidi+")";
}
}
public String chenQiu(String op1, String op2, String dfdx1, String dfdx2){
// 将两个导数按照乘法法则组合起来
String xi1 = chen(op1, dfdx2);
String xi2 = chen(op2, dfdx1);
String result = complexPlus(xi1, xi2);
if(result.split("[+]").length!= 1){
return "("+result+")";
}
else return result;
}
public String plusQiu(String c){
String[] factors = c.split("\\+");
// 分别求出两个简单函数的导数
String dfdx1 = complexQiu(factors[0]);
String dfdx2 = complexQiu(factors[1]);
// 将两个导数按照乘法法则组合起来
String result = Plus(dfdx1, dfdx2);
return result;
}
public ArrayList<String> plusSplit(String s){
ArrayList<String> result = new ArrayList<>();
s = s.replaceAll("\\s", "");
String[] parts = s.split("(?<=[+-]|\\s)|(?<=\\*|\\s)|(?<=[()]|\\s)|(<=[()])");
ArrayList<String> format = new ArrayList<>();
for (int i = 0; i < parts.length; i++) {
if(parts[i].length() >1&&(parts[i].endsWith("*")||parts[i].endsWith("+")||parts[i].endsWith("-")||parts[i].endsWith("(")||parts[i].endsWith(")"))){
format.add(parts[i].substring(0, parts[i].length() - 1));
format.add(""+parts[i].charAt(parts[i].length()-1));
}else if(parts[i].equals("*")&&format.get(format.size()-1).equals("*")){
format.set(format.size()-1, "**");
}
else{
format.add(parts[i]);
}
}
String index = "";
if(format.get(0).equals("(")) {
format.remove(0);
format.remove(format.size()-1);
}
for(int i = 0;i<format.size();i++){
if(format.get(i).equals("+")) {
result.add(index);
index = "";
}else{
index += format.get(i);
}
}
result.add(index);
return result;
}
public ArrayList<String> MultiSplit(String s){
ArrayList<String> result = new ArrayList<>();
s = s.replaceAll("\\s", "");
String[] parts = s.split("(?<=[+-]|\\s)|(?<=\\*|\\s)|(?<=[()]|\\s)|(<=[()])");
ArrayList<String> format = new ArrayList<>();
for (int i = 0; i < parts.length; i++) {
if(parts[i].length() >1&&(parts[i].endsWith("*")||parts[i].endsWith("+")||parts[i].endsWith("-")||parts[i].endsWith("(")||parts[i].endsWith(")"))){
format.add(parts[i].substring(0, parts[i].length() - 1));
format.add(""+parts[i].charAt(parts[i].length()-1));
}else if(parts[i].equals("*")&&format.get(format.size()-1).equals("*")){
format.set(format.size()-1, "**");
}
else{
format.add(parts[i]);
}
}
String index = "";
for(int i = 0;i<format.size();i++){
if(format.get(i).equals("*")&&!format.get(i+1).equals("*")) {
result.add(index);
index = "";
}
else{
index += format.get(i);
}
}
result.add(index);
return result;
}
public String chen(String a, String b){
if(a.equals("0")||b.equals("0"))return "0";
else if(a.equals("1")) return b;
else if(b.equals("1")) return a;
else if(a.equals("-1"))return "-"+b;
else if(b.equals("-1"))return "-"+a;
else if(b.charAt(0) == '-'&&a.charAt(0)!= '-') return "-"+a+"*"+b.substring(1, b.length());
else if(b.charAt(0) == '-'&&a.charAt(0)== '-') return a+"*"+b.substring(1, b.length());
else if(b.charAt(0) == '('){
String result = "";
ArrayList<String> splits = plusSplit(b.substring(1, b.length()-1));
for(int i = 0; i< splits.size();i++){
result += a + "*" +splits.get(i)+"+";
}
return result.substring(0, result.length()-1);
}else if(a.charAt(0) == '('){
String result = "";
ArrayList<String> splits = plusSplit(a.substring(1, a.length()-1));
for(int i = 0; i< splits.size();i++){
result += b + "*" +splits.get(i)+"+";
}
return result.substring(0, result.length()-1);
}else if(a.charAt(0) == '(' && b.charAt(0) == '('){
String result = "";
ArrayList<String> split1 = plusSplit(a.substring(1, a.length()-1));
ArrayList<String> split2 = plusSplit(b.substring(1, b.length()-1));
for(int i = 0; i< split1.size();i++){
for(int j = 0; j<split2.size();j++){
result += split1.get(i) + "*" +split2.get(j);
}
result += "+";
}
return result.substring(0, result.length()-1);
}
return a + "*" + b;
}
public String Plus(String a, String b){
if(a.equals("0")||a.equals("")) return b;
else if(b.equals("0")||b.equals("")) return a;
else if(a.matches("\\d+")&&b.matches("\\d+")){
int c = Integer.parseInt(a)+Integer.parseInt(b);
return Integer.toString(c);
}
else return a + "+" + b;
}
public String complexPlus(String a, String b){
String result = "";
int xi = 0;
ArrayList<String> asplit = plusSplit(a);
ArrayList<String> bsplit = plusSplit(b);
ArrayList<String> res = new ArrayList<>();
for(int i = 0; i < asplit.size();i++){
if(asplit.get(i).matches("\\d+")){
xi += Integer.parseInt(asplit.get(i));
}else{
res.add(asplit.get(i));
}
}
for(int j = 0; j< bsplit.size(); j++){
if(bsplit.get(j).matches("\\d+")){
xi += Integer.parseInt(bsplit.get(j));
}else{
res.add(bsplit.get(j));
}
}
result = Integer.toString(xi);
for(int i = 0; i<res.size();i++){
result = Plus(result, res.get(i));
}
return result;
}
public String jian(String a, String b){
if(a.equals("0")) return "-"+b;
else if(b.equals("0")) return a;
else if(a.matches("\\d+")&&b.matches("\\d+")){
int c = Integer.parseInt(a)-Integer.parseInt(b);
return Integer.toString(c);
}
else return a + "-" + b;
}
public String complexQiu(String s) {
if(s.charAt(0) == '(') s = s.substring(1, s.length()-1);
Stack<String> biaoda = new Stack<>();
Stack<String> operators = new Stack<>();
s = s.replaceAll("\\s", "");
String[] parts = s.split("(?<=[+-]|\\s)|(?<=\\*|\\s)|(?<=[()]|\\s)|(<=[()])");
ArrayList<String> format = new ArrayList<>();
for (int i = 0; i < parts.length; i++) {
if(parts[i].length() >1&&(parts[i].endsWith("*")||parts[i].endsWith("+")||parts[i].endsWith("-")||parts[i].endsWith("(")||parts[i].endsWith(")"))){
format.add(parts[i].substring(0, parts[i].length() - 1));
format.add(""+parts[i].charAt(parts[i].length()-1));
}else if(parts[i].equals("*")&&format.get(format.size()-1).equals("*")){
format.set(format.size()-1, "**");
}
else{
format.add(parts[i]);
}
}
for (int i = 0; i < format.size(); i++) {
if(i == 0 && ((format.get(i).equals("+")||format.get(i).equals("-"))&&format.get(i+1).matches("\\d+"))){
biaoda.push("0");
if(format.get(i).equals("+")) biaoda.push(format.get(i+1));
else biaoda.push(format.get(i)+format.get(i+1));
i++;
}
else if(format.get(i).matches("\\d+")){
biaoda.push("0");
biaoda.push(format.get(i));
}
else if((i < format.size() - 1&&format.get(i).equals("x")&&(!format.get(i+1).equals("**")))||i == format.size()-1){
biaoda.push("1");
biaoda.push(format.get(i));
}
else if(format.get(i).equals("(")){
int cout = 1;
String bos = "";
i++;
while(cout > 0){
if(format.get(i).equals("("))cout++;
if(format.get(i).equals(")"))cout--;
bos += format.get(i);
i++;
}
i--;
biaoda.push(complexQiu(bos.substring(0, bos.length()-1)));
biaoda.push(bos.substring(0, bos.length()-1));
}
else if(format.get(i).equals("sin")||format.get(i).equals("cos")){
String jidi = format.get(i);
String cpsqiu = "";
String cps = "";
i += 2;
while(!format.get(i).equals(")")){
cps += format.get(i);
i++;
}
if(!cps.equals("x")){
cpsqiu = complexQiu(cps);
//求导函数 原函数
biaoda.push(chen(SanjQiu(jidi, cps), cpsqiu));
biaoda.push(jidi+"("+cps+")");
}else{
biaoda.push(SanjQiu(jidi, cps));
biaoda.push(jidi+"("+cps+")");
}
}
else if(format.get(i).equals("**")){
String jidi = "";
String zhi = "";
String yuan = "";
if(format.get(i-1).equals(")")){
jidi = biaoda.pop();
yuan = biaoda.pop();
biaoda.push(chen(miQiu(jidi,Integer.parseInt(zhi)), yuan));
biaoda.push(jidi+"**"+zhi);
}
else jidi = format.get(i - 1);
zhi = format.get(i+1);
i++;
//求导函数+原函数
biaoda.push(miQiu(jidi, Integer.parseInt(zhi)));
biaoda.push(jidi+"**"+zhi);
}
else if(format.get(i).equals("*")){
operators.push(format.get(i));
}
else if(i<format.size()-1&&(format.get(i).equals("+")||format.get(i).equals("-"))){
while(!operators.isEmpty() && operators.peek().equals("*")){
operators.pop();
String op1 = biaoda.pop();
String Qop1 = biaoda.pop();
String op2 = biaoda.pop();
String Qop2 = biaoda.pop();
//求导函数
biaoda.push(chenQiu(op1, op2, Qop1, Qop2));
//原函数
biaoda.push(chen(op2, op1));
}
if((format.get(i).equals("-")&&format.get(i+1).equals("+"))||(format.get(i).equals("+")&&format.get(i+1).equals("-"))) {
operators.push("-");
i++;
if(biaoda.isEmpty()){
String op = operators.pop();
if(op.equals("-")) format.set(i+1, op+format.get(i+1));
}
}
else if((format.get(i).equals("-")&&format.get(i+1).equals("-"))||(format.get(i).equals("+")&&format.get(i+1).equals("+"))) {
operators.push("+");
i++;
if(biaoda.isEmpty()){
String op = operators.pop();
if(op.equals("-")) format.set(i+1, op+format.get(i+1));
}
}else operators.push(format.get(i));
}
}
while (!operators.isEmpty()) {
String operator = operators.pop();
if(operator.equals("*")){
String op1 = biaoda.pop();
String Qop1 = biaoda.pop();
String op2 = biaoda.pop();
String Qop2 = biaoda.pop();
//求导函数
biaoda.push(chenQiu(op1, op2, Qop1, Qop2));
//原函数
biaoda.push(chen(op2, op1));
}else{
String yop1 = biaoda.pop();
String op1 = biaoda.pop();
String yop2 = biaoda.pop();
String op2 = biaoda.pop();
if(operator.equals("+")){
biaoda.push(complexPlus(op1,op2));
biaoda.push(complexPlus(yop1,yop2));
}else{
biaoda.push(jian(op1,op2));
biaoda.push(jian(yop1,yop2));
}
}
}
biaoda.pop();
return biaoda.pop();
}
public String Simplify(String s){
String result = "";
ArrayList<String> resdis = new ArrayList<>();
ArrayList<String> plusdis = plusSplit(s);
HashMap<String, String> alls = new HashMap<>();
for(int i = 0; i<plusdis.size();i++){
ArrayList<String> multdis = MultiSplit(plusdis.get(i));
HashMap<String, Integer> multSim = new HashMap<>();
int xi = 1;
if(multdis.get(0).charAt(0) == '-') {
xi = -1;
multdis.set(0, multdis.get(0).substring(1,multdis.get(0).length()));
}
for(int j = 0; j < multdis.size();j++){
if(multdis.get(j).matches("\\d+")){
xi *= Integer.parseInt(multdis.get(j));
}else if(multdis.get(j).matches("x")){
if(multSim.containsKey("x"))multSim.put("x", multSim.get("x")+1);
else multSim.put("x", 1);
}
else if(multdis.get(j).matches("(.*)\\*\\*\\d+")){
String base = multdis.get(j).split("\\*\\*")[0];
int zhi = Integer.parseInt(multdis.get(j).split("\\*\\*")[1]);
if(multSim.containsKey(base))multSim.put(base, multSim.get(base)+zhi);
else multSim.put(base, zhi);
}
else if(multdis.get(j).matches("sin\\(.*\\)")||multdis.get(j).matches("cos\\(.*\\)")){
if(multSim.containsKey(multdis.get(j)))multSim.put(multdis.get(j), multSim.get(multdis.get(j))+1);
else multSim.put(multdis.get(j), 1);
}
}
resdis.add(Integer.toString(xi));
String index = "";
String all = Integer.toString(xi);
for(String key:multSim.keySet()){
index = "";
if(multSim.get(key) == 1)index += key;
else index+=key+"**"+Integer.toString(multSim.get(key));
resdis.add(index);
if(alls.containsKey(index)) alls.put(index, complexPlus(alls.get(index), all));
else alls.put(index, all);
all = chen(all, index);
}
resdis.add("+");
}
// System.out.println(alls);
String index = "1";
for(int i = 0; i<resdis.size();i++){
// System.out.println(resdis.get(i));
if(resdis.get(i).equals("+")){
result = complexPlus(result, index);
index = "1";
}else{
if(alls.containsKey(resdis.get(i))&&!alls.get(resdis.get(i)).equals(index)&&!alls.get(resdis.get(i)).equals("no")){
index = "("+alls.get(resdis.get(i))+")"+"*"+resdis.get(i);
alls.put(resdis.get(i), "no");
}else if(alls.containsKey(resdis.get(i))&&alls.get(resdis.get(i)).equals("no")){
index = "0";
}else{
index = chen(index, resdis.get(i));
}
}
}
return result;
}
public static void main(String[] args) {
Qiudao q = new Qiudao();
String yuan = q.complexQiu("5* x**4* sin(x)");
System.out.println(yuan);
String s = q.Simplify(yuan);
System.out.println(s);
}
}