根据多组 2 个变量和结果找到方程

逆向工程 静态分析
2021-06-27 21:14:30

我目前正在尝试对游戏中使用的一些方程进行逆向工程,并收集了所有相关数据。

在下面的示例中,结果速度绝对完全基于推力和重量变量。请注意,游戏确实使用了变量,但会将数字四舍五入

thrust | weight | speed
       |        |
   428 | 13575  | 188
   617 | 13575  | 209
   536 | 23850  | 152
   995 | 35750  | 175
   698 | 17475  | 202
  1373 |  8575  | 278

除了蛮力之外,我是否可以使用这些数据通过任何方式找到方程?我环顾四周,但只发现了使用单个变量的东西。除了随之而来的重量增加之外,推力的回报似乎也在递减。

不知道如何标记这个

我最初在这里问这个(https://math.stackexchange.com/questions/2727993/find-equation-based-on-multiple-sets-of-2-variables-and-results),其中一个回应建议我把问题带到这里。

2个回答

虽然有可能提出一些方程并从样本值中找出系数,但它们也可能以某种非显而易见的方式连接,因此最好的解决方案是追踪计算速度的代码并查看它究竟是如何使用推力和重量的。

最好的方法是实际 RE 二进制文件,但由于我们没有,我将提出另一种方法。

我们可以使用像z3这样的 sat 求解器来为我们找出解决方案。

有这样的脚本:

from collections import namedtuple
DataPoint = namedtuple('DataPoint', 'thrust weight speed')

data = [DataPoint(428, 13575, 188),
    DataPoint(617, 13575, 209),
    DataPoint(636, 23850, 152),
    DataPoint(995, 35750, 175),
    DataPoint(698, 17474, 202),
    DataPoint(1373, 8575, 278)]

from z3 import *

a = Int('a')
b = Int('b')

s = Solver()
for e in data:
  s.add(a*e.thrust+b*e.weight==e.speed)

print(s.check())

对我们来说不幸的是,当运行上面的我们得到:

➜ 17928 python sol.py
unsat

线性方程没有解——但如果你知道它应该是什么类型的方程,你就有了一个可以研究的模型。这些数据的第一个问题是我们不知道单位。速度等于188,但什么?是公里/小时还是节?或者为了游戏的目的还有其他更想象的东西?

游戏触及了我们可能想要参考的物理现实。航空中有一个推重比可以帮助你从中推断出一些东西(也许在推力、重量和速度之间有一些相关性)但要知道也许我们需要问一下航空