You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多项式绘图工具Y值翻转偏移问题技术求助

问题分析与修复方案

核心问题1:多项式求值逻辑错误

你的sub方法计算多项式的方式完全错误,当前代码把系数与x的乘积作为底数取幂,正确的多项式计算应该是系数乘以x的对应次幂。比如输入系数列表[1.0, 0.0],正确的多项式是1.0*x^1 + 0.0,但你的代码计算逻辑会导致高阶项或非1系数的场景出现严重偏差,这是逻辑上的根本错误。

核心问题2:坐标映射逻辑错误

  • 网格的行索引和数学Y轴方向相反:数学中Y值越大越靠上,但你的网格里r=0是顶部、r=10是底部,所以需要用5 - yVal将数学Y值转换为网格行索引(r=5对应Y=0)。
  • 原代码中处理负Y值的逻辑完全错误,直接加5会导致偏移,应该统一使用转换公式后再判断是否在网格范围内。
  • 原代码错误地将grid[i][yVal]设为*,这里的i是X对应的列索引,正确的赋值应该是grid[转换后的行索引][i]。

修正后的代码

1. 修复sub方法

public static double sub(ArrayList<Double> currentCoefList, double val) {
    double subbed = 0.0;
    int degree = currentCoefList.size() - 1; // 多项式最高次数
    for (int i = 0; i < currentCoefList.size(); i++) {
        // 正确计算:系数 × x的(最高次 - i)次方
        subbed += currentCoefList.get(i) * Math.pow(val, degree - i);
    }
    return subbed;
}

2. 修复makesGraph方法的坐标映射逻辑

public static char[][] makesGraph(ArrayList<Double> currentArrayList) {
    int row = 11;
    int col = 11;
    int xVal = -5;
    int[] ysVal = new int[11];
    char[][] grid = new char[row][col];

    // 初始化网格坐标轴
    for (int r = 0; r < grid.length; r++) {
        for (int c = 0; c < grid[0].length; c++) {
            if (r == 5 && c == 5) {
                grid[r][c] = '+';
            } else if (c == 5) {
                grid[r][c] = '|';
            } else if (r == 5) {
                grid[r][c] = '-';
            } else {
                grid[r][c] = ' ';
            }
        }
    }

    // 计算每个X对应的Y值(直接在这里做四舍五入)
    for (int i = 0; i < grid[0].length; i++){
        ysVal[i] = (int) Math.round(sub(currentArrayList, xVal));
        xVal++;
    }

    // 将Y值映射到网格并标记
    for (int i = 0; i < grid[0].length; i++) {
        int yVal = ysVal[i];
        // 转换数学Y值为网格行索引:r=5对应Y=0,Y增大则行索引减小
        int gridRow = 5 - yVal;
        // 确保行索引在网格范围内
        if (gridRow >= 0 && gridRow < row) {
            grid[gridRow][i] = '*';
        }
    }

    // 打印网格
    for (int r = 0; r < grid.length; r++) {
        for (int c = 0; c < grid[0].length; c++) {
            System.out.print(grid[r][c]);
        }
        System.out.println();
    }

    return grid;
}

测试验证

  • 输入[1.0, 0.0](对应y=x):X从-5到5时,Y值从-5到5,转换后网格中会形成一条从左下到右上的斜线,无偏移无翻转。
  • 输入[1.0, 2.0](对应y=x+2):Y值比y=x整体高2,转换后斜线整体上移,符合预期。

内容的提问来源于stack exchange,提问作者Mikey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:05:40