求非线性方程 y=ax^b,已知x,y, 求a和b,需要java实现方法

..天空\.. 2020-09-14 02:58:36
求非线性方程 y=ax^b,已知x,y, 求a和b,需要java实现方法
x y
0.05 0.01
0.1 0.04
0.15 0.08
0.2 0.137
0.25 0.207
0.3 0.288
0.35 0.386
0.4 0.502
0.45 0.631
0.5 0.781

我知道结果, 但是不知道计算过程
a=2.7972, b=1.8712

求教..............
...全文
509 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
浪费七年时间 2020-09-14
  • 打赏
  • 举报
回复
数学的东西都忘了(其实是不会),不过这种题网上搜一下就有答案了 用java怎么拟合形如y=ax^b的幂函数
引用
对 y=ax^b 两边同时取 ln,变换成线性方程 ln(y)=ln(a)+b*ln(x),最小二乘法拟合
ln(x)看作x',ln(y)看作y',b看作a',ln(a)看作b',线性方程是 y' = a'x' + b',然后再找下Java最小二乘直线拟合的代码 最小二乘法的Java实现 然后自己再处理下数据

public class MyLineRegression {

    public static void main(String[] args) {
        double[] x = {0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5};
        double[] y = {0.01, 0.04, 0.08, 0.137, 0.207, 0.288, 0.386, 0.502, 0.631, 0.781};

        double[] lnx = Arrays.stream(x).map(Math::log).toArray();
        double[] lny = Arrays.stream(y).map(Math::log).toArray();

        Map<String, Double> result = new MyLineRegression().lineRegression(lnx, lny);

        System.out.println("a = " + Math.pow(Math.E, result.get("b").doubleValue()));
        System.out.println("b = " + result.get("a").doubleValue());
        System.out.println("r = " + result.get("r").doubleValue());
    }

    /**
     * 最小二乘法
     *
     * @param X
     * @param Y
     * @return y = ax + b, r
     */
    public Map<String, Double> lineRegression(double[] X, double[] Y) {
        if (null == X || null == Y || 0 == X.length
                || 0 == Y.length || X.length != Y.length) {
            throw new RuntimeException();
        }

        // x平方差和
        double Sxx = varianceSum(X);
        // y平方差和
        double Syy = varianceSum(Y);
        // xy协方差和
        double Sxy = covarianceSum(X, Y);

        double xAvg = arraySum(X) / X.length;
        double yAvg = arraySum(Y) / Y.length;

        double a = Sxy / Sxx;
        double b = yAvg - a * xAvg;

        // 相关系数
        double r = Sxy / Math.sqrt(Sxx * Syy);
        Map<String, Double> result = new HashMap<String, Double>();
        result.put("a", a);
        result.put("b", b);
        result.put("r", r);

        return result;
    }

    /**
     * 计算方差和
     *
     * @param X
     * @return
     */
    private double varianceSum(double[] X) {
        double xAvg = arraySum(X) / X.length;
        return arraySqSum(arrayMinus(X, xAvg));
    }

    /**
     * 计算协方差和
     *
     * @param X
     * @param Y
     * @return
     */
    private double covarianceSum(double[] X, double[] Y) {
        double xAvg = arraySum(X) / X.length;
        double yAvg = arraySum(Y) / Y.length;
        return arrayMulSum(arrayMinus(X, xAvg), arrayMinus(Y, yAvg));
    }

    /**
     * 数组减常数
     *
     * @param X
     * @param x
     * @return
     */
    private double[] arrayMinus(double[] X, double x) {
        int n = X.length;
        double[] result = new double[n];
        for (int i = 0; i < n; i++) {
            result[i] = X[i] - x;
        }

        return result;
    }

    /**
     * 数组求和
     *
     * @param X
     * @return
     */
    private double arraySum(double[] X) {
        double s = 0;
        for (double x : X) {
            s = s + x;
        }
        return s;
    }

    /**
     * 数组平方求和
     *
     * @param X
     * @return
     */
    private double arraySqSum(double[] X) {
        double s = 0;
        for (double x : X) {
            s = s + Math.pow(x, 2);
            ;
        }
        return s;
    }

    /**
     * 数组对应元素相乘求和
     *
     * @param X
     * @return
     */
    private double arrayMulSum(double[] X, double[] Y) {
        double s = 0;
        for (int i = 0; i < X.length; i++) {
            s = s + X[i] * Y[i];
        }
        return s;
    }

}
得到 a = 2.7971554678111508 b = 1.8711560608493885 r = 0.9998278572384243

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧