Java中是否有用于(内部等式)的求解方法?

Java中是否有用于(内部等式)的求解方法?,java,math,solver,Java,Math,Solver,如果我想从下面的方程中解出变量(p),其他一切都已知: Java中有没有一种方法可以让我这样做 我可以用我的计算器来完成这项工作,而且我确信Python有它的功能——所以我知道它是可行的。多谢各位 以下是快速参考图: 带圆的x值将是满足方程两侧的(p)。但是计算所有值,然后检查零并不是最有效的方法。您必须实现函数,给出方程两边的差,然后是某种单变量解算器。由于该方程在正轴上的凸性,所有经典方法,特别是割线法,都应该完美地工作 class myfunc { public myfunc(

如果我想从下面的方程中解出变量(p),其他一切都已知:

Java中有没有一种方法可以让我这样做

我可以用我的计算器来完成这项工作,而且我确信Python有它的功能——所以我知道它是可行的。多谢各位

以下是快速参考图:


带圆的x值将是满足方程两侧的(p)。但是计算所有值,然后检查零并不是最有效的方法。

您必须实现函数,给出方程两边的差,然后是某种单变量解算器。由于该方程在正轴上的凸性,所有经典方法,特别是割线法,都应该完美地工作

class myfunc {
    public myfunc(int nn, int cc, double aalpha) {...}

    public double eval(double p) {
        double sum = 1;
        double term = 1;
        for(int i = 1; i<=c; i++) {
             term *= (n*p)/i;
             sum += term;
         }
         return sum*Math.exp(-n*p) - alpha;
     }
}

..............

public double secant(myfunc f, double a, double b) {
    double fa = f.eval(a);
    double fb = f.eval(b);
    while(Math.abs(b-a)>1e-10) {
        double c = (a*fb-b*fa)/(fb-fa);
        a=b; fa = fb;
        b=c; fb = f.eval(b);
    }
    return b;
}

结果表明,割线法是不稳定的,使用修正的regula-falsi法

import java.lang.*;

interface RealFunc {
    public double eval(double x);
}

class myfunc implements RealFunc {

  int c,n;  
  double alpha;

  public myfunc(int nn, int cc, double aalpha) {
    c=cc; n=nn; alpha = aalpha;
  }

  public double eval(double p) {
    double sum = 1;
    double term = 1;
    for(int i = 1; i<=c; i++) {
        term *= (n*p)/i;
        sum += term;
     }
     return sum*Math.exp(-n*p) - alpha;
   }
}


public class SecantSolverSO34980366 {

  static public double illinois(RealFunc f, double a, double b) {
        double fa = f.eval(a);
        double fb = f.eval(b);
        while(Math.abs(b-a) > 1e-10) {
        //System.out.printf("a:f(%16.12f) = %16.12f | b: f(%16.12f) = %16.12f \n ",a,fa,b,fb);
          double c = (a*fb-b*fa)/(fb-fa);
          double fc = f.eval(c);
          if( fa*fc < 0 ) {
            fa *= 0.5;
          } else {
            a = b; fa = fb;
          }
          b = c; fb = fc;
      }
      return b;
  }


  public static void main(String[] args) {
    int n = 1;

    for(double alpha = 0.2; alpha <=1.0001; alpha += 0.1) {
        System.out.printf("alpha=%4.2f: ", alpha);
        for(int c = 2; c < 15; c+=2) {

            double p = illinois(new myfunc(n,c,alpha), 0.,(c+13.0)/n);
            System.out.printf("(c=%2d):%12.9f  ",c,p);
        }
        System.out.printf("\n");
    }

  }
}
import java.lang.*;
接口实函数{
公共双评估(双x);
}
类myfunc实现RealFunc{
int c,n;
双α;
公共myfunc(整数nn、整数cc、双aalpha){
c=cc;n=nn;alpha=aalpha;
}
公共双评估(双p){
双和=1;
双项=1;
对于(int i=1;i 1e-10){
//系统输出打印f(“a:f(%16.12f)=%16.12f | b:f(%16.12f)=%16.12f\n”,a、fa、b、fb);
双c=(a*fb-b*fa)/(fb-fa);
双fc=f.eval(c);
如果(fa*fc<0){
fa*=0.5;
}否则{
a=b;fa=fb;
}
b=c;fb=fc;
}
返回b;
}
公共静态void main(字符串[]args){
int n=1;

对于(double alpha=0.2;alpha,Apache Commons Math中有几种数值方法可用于查找函数的根。请参阅。Java中可能还有许多其他现有的数值方法库

至于象征性地解这些方程,我不知道用Java最好的方法。你可以编译一个计算机代数系统,比方说,使用基于JVM的Lisp(我知道,但可能还有其他的)

以符号方式解方程很困难,Maxima的符号解算器也不太强大。但经过一些劝诱,我得到了以下结果,您需要在使用它之前进行验证:

(1 - alpha) c! = gamma_greek(c + 1, n*p)

其中
gamma\u-greek
是较低的不完全gamma函数。因此,如果您有较低的不完全gamma函数的逆函数的实现,则无需调用根查找算法即可解决此问题。Apache Commons Math似乎没有,尽管其他库可能有。另请参见。祝您好运,玩得开心。

ly不是内置的,这已经够复杂了,我甚至不知道它有一个库。什么是alpha,c,n?-我在哪里?什么常数?当然-我写错了!在方程中用i替换c。我从0到i?我修正了它-见上文。已知的一切都是常数-p未知。谢谢你的帖子。我不尝试用符号来解决它。所有常数都会被赋予一个值,而(p)基本上必须满足双方的要求。我来看看这些东西。你能提供一些更详细的实现方法吗。例如:你在“eval”中传递了什么p值函数?操作顺序是什么?再次感谢。因为这些是泊松过程的累积概率,所以α在(0,1)中并且会认为p相当小。因此,值a=0和b=0.1应该是普遍合理的,即使实际结果要大得多。@LultzL最后一个帮助:你能写这个函数吗?也许它会有意义。我的累积概率分布是1。我也在想,既然n是固定的,我可以只写np=lambda-然后在我找到它的值后进行除法。再次非常感谢。
(1 - alpha) c! = gamma_greek(c + 1, n*p)