下载 App
含绝对值的函数[阶跃(类分段)/折线/…][f(x)/f′(x)/f″(x)/…]
修改于1 小时前908 浏览攻略
高三,停更小半年
游戏基础类:
数字上下限: [小数不可超10^-323.6多,数大不别超±2^1023多]
格子长度:2.5
发射函数变换:Y(x)=f(x-x₀)+y₀-f(0)
前前言:过了两个月回顾一下,发现之前写的有点屎山了,这次优化一点,增加了若干整数阶导的应对办法
前言:绝对值其实被低估太多了.如果你想用别的插值,龙格会干扰你/计算量巨大/因平滑而难以预料;如果你想分段,函数你难以估准.但绝对值不怕这个,它有它们的优点,却没那么多缺点.它可以任意地上、下、右,随意移动而不受任何限制!且准度是100%(因为这是插值法的一种),没有任何方法超越这个准度!而且它兼容性极强,可以随意切出任意函数(不建议用它做复合函数,会增加长度以减少拐点).虽然我是最早发的,但是一切带abs的类似函数在数学上应该都等价于这个,因此,简便才是王道.
设玩家初始的随机坐标为(x₀,y₀)
本贴只讨论了与绝对值相关的函数,请读者们大胆开发.
1.初步了解
首先,认识一下绝对值,它在游戏中的体现是: abs
abs(任意函数)=|任意函数|
它的做用是让函数的负值变为正值,也可以说是让函数沿x轴翻折.是复数的模的下位.
再了解一下导数(因为这篇还要把导数模式解决):一阶偏导与导数没区别,我们就当求出原函数各个点的斜率,然后用这些斜率当对应点的y值.新函数便计作f′(x)[还不清楚的可以看看佩恩的导数基础贴]
由此可见,上下平移(斜率不变)是不影响导数的.那么,若f(x)+常数=g(x).则f′(x)=g′(x).由于游戏抹平了常数项,所以玩家打出f(x)与打出g(x)效果一样.
那想下,绝对值的函数图像可由什么函数图像上下平移而得到呢?
根号下(x²)=|x| (这就是绝对值走向多阶导的关键)
2.简要说明
任取一个函数y=f(x),加上绝对值|y|=|f(x)|.这是什么?是y>0处不变,y<0处为-f(x).
因此,我们可以想出以下几个函数(通篇基本都是基于这几个+一次函数)
f(x)+|f(x)| : 原函数>0处是2f(x),小于0处是0.
f(x)-|f(x)| : 原函数>0处是0,小于0处是2f(x)
以及|f(x)|-f(x)与-f(x)-|f(x)|
3.稍作应用
(一次函数)
观察函数
y=|x|+x
得出该函数在(-∞,0]恒等于0,在(0,+∞)等于2x
那么, y₁=(|x|+x)/2 在(-∞,0]处也等于0,在(0,+∞)等于x
这里把y₁向右平移a个单位,使函数在(-∞,a]等于0,在(a,+∞)等于x-a.[即以(x₀+a,y₀)为原点发射了y=x]
y₂=(x-a+|x-a|)/2=(x+|x-a|)/2
由上句话得,我们可以通过移动后的y₂×(待定函数)达成在a之前恒为0,在a时突变为(待定函数)x
这里待定函数可以当做是斜率了.
问题一:我不想输出一次函数,只想突变为sin或cos的这种怎么办?
有些糯米: sin[ (x-a+abs(x-a)/2]
我们先忽略对的个例
有些人会想到除以x-a再乘,让待定函数变为 (想要表现的函数)/(x-a) 这种形式
这是个典型的错误,我们试一次就会发现,打不出来.检查一下,分母是不能为0的
所以,想突变为这种非一次函数的,要用y₂×[(想要表现的函数)/(x+一个很小的数)].我们通常用0.001或10⁻⁶或0.1⁶什么的(注意,使用后两个不要使函数过大,近似2¹⁰²³就要小心了)
缺陷:打出来是打出来了,但是渐变的(除非你就想缓缓变大)
实际上,我们想要突变,要在y₂上动手脚
令y₃=(|x-a|+x-a)/[2(|x-a|+一个很小的数)]
则y₃*sin(x)便可以达到在a后突变了.
类似的,爱睡觉的小糯米的方法也可行,不过在x=a时是 想表现的函数/2,由于那个与绝对值无关,这里不细说了.
问题二:你这函数突变是突变了,但显示出来后就没有收回的余地了啊.我要[始,0]是0,[0,5]是x,[5,7]是sin(x),该怎么办?
我们还是有办法的(没办法我就不发了\不是)
首先想出:约掉
让[0,5]时显示为x,[5,7]时显示个sin(x)-x不就行了么
答案很显然,如果你连这么大错误都发现不了的话,就……就没被我这句话骗到
这个想法其实是可行的
这个想法其实是可行的但实践中也并非完美,它会在a处产生一个断层
以我e的那个g子来说,它产生了一个大约是6的猛降
平稳与简便不可兼得,想要平.就要上增量了
让 想表达的函数1×{[|(x-a₁+b)|-|(x-a₁-b)|]/2b}
a是突变起始点
这里2b是多长变化完(b越小越好)
之后,约分就是
y=想表达的函数1×{[|(x-a₁+b)|-|(x-a₁-b)|]/2b}+【(想表达的函数2-想表达的函数1)×{[|(x-a₂+b)|-|(x-a₂-b)|]/2b}】+……
4.略微结合
前面讲了不少,但实战想在60s内做完就有点捉襟见肘了,有没有什么简便的方法呢?
我们刚开始用(x-a+|x-a|)/2时,不难发现就是想要a左为0,a右为……为…………为我所用![[表情_吐舌头]](https://img-tc.tapimg.com/market/images/945b09ff7a33dc3966007a3e87896ebf.png)
![[表情_吐舌头]](https://img-tc.tapimg.com/market/images/945b09ff7a33dc3966007a3e87896ebf.png)
刚刚又讲了消去的方法,那么,结合一下
我们可以得到:斜率是累积的!
反应快的人应该想出来了
垫脚式(石)1
y=y₂*k₁+y₃*(sin(x)-k₁x)+……=y₃*(表达函数1)+(另一个)y₃*(表达函数2-表达函数1)+(另另一个)y₃*(表达函数3-表达函数2)±……
优点:任意函数完美输出,理论上的完美公式.
缺点:与所有阶跃函数一样,能确定突变点,用什么函数打却找不准具体点,冒然sin则容易撞障.公式太长.
垫脚式(石)2
在函数内部嵌套折线,使(a,b)为f(kx),非(a,b)为f(?)=0 [函数没零点就上加下减]
原理: 相对x坐标↦(映射)内部折线的y值=外层函数的x值↦外层函数的y值
优点:外层函数(可有多个外层函数)的值域中的所有值任意挑选,可以自由控制函数疏密.可以与别的函数复合以达到定点大范围攻击
缺点:计算量大,要经过多次映射才能对应y值,短时间内达不到精准定点,只能靠密度大的外层函数来弥补短时间内定不准点的问题(易撞障)
"把垫脚式1中的表达函数变为垫脚式2"或者"万能公式(a,b)时k=0,再加sin(……)"都能达到图像分段的效果,不过本fw考验你准度,不扩展你打字速度
万能公式(当然,ta们更喜欢叫绝对值折线之类的名):找一个相对简便的函数
k|x-a|
k为斜率
abs(x-a)=abs(a-x).怎么输都行
因游戏特性(发射点会将输入函数的图像与y轴的交点平移至自身),排除了起始点x>a的情况
所以[始,a)中abs(x-a)=a-x
我们利用消去法,可以得出
y₄=?₁x+?₂abs(a-x)+?₃abs(b-x)±……
绝对值万能公式速算方法及推导:
正常算,全部展开,?₁±……±?ₙ不断换区间,最后要解方程,点过四个人都炸了.
简便算,目押一下,发现我方至敌方有一条行的通的线(没有则只能硬打).
有一条能通的线.打中目标、躲障碍物就可以定下必定经过的点(发射点也是一个)
我们知道,这些拐点的x值可以由小到大依次排列.(你想直上直下就加个小增量)
若共计n个必过点,则至少有n-1个k(最后一段之外就不管了,算上就是n个k)
kᵢ=(yᵢ-yᵢ₋₁)/(xᵢ-xᵢ₋₁) [i与i-1一起反过来也一样]
现在,我们就有了初始斜率与拐点斜率
有了这些,我们先导一次
导数是不连续的分段函数!
虽然知道它分段,可我们怎么表示呢?
绝对值函数的导数图像很容易画出,但怎么用函数写出呢
是的,|x|/x或x/|x|的变式恰好符合,这两个式子在数学中用sgn(x)表示.
不是,凭什么你发现它就是,注意力惊人?
当然~,不.之前说过,|x|=根号下(x²)那么就是(x²)^½.对其求导.得½*(x²)^-½*2x*1=x/[(x²)^½].即x/|x|
定义一个分段函数
H(x): x↦0 (x<0时); x↦1 (x>0时)
显然,它=(1+sgn(x))/2
f′(x)=k₁+(k₂-k₁)H(x-x₁)+(k₃-k₂)H(x-x₂)+……
你甚至可以对这个再导一次
f″(x)=(k₂-k₁)δ(x-x₁)+(k₃-k₂)δ(x-x₂)+……
这些证明了它指哪打哪的核心
(当时还不是很服,于是上升到n阶.服了)
{你要是不单单想在f(x)模式用,还想在f′(x)里用,就把H(x)拆成纯abs的形式[abs(x)求导为sgn(x).如abs(x-6)=sgn(x-6)=(x-6)/abs(x-6)].注:f″(x)模式下sgn(x)会归0(准确说,我导完是0/x²或0/x⁴之类的……是的,不同法则或不同等价形态导数居然不一样),无法直接输入(但有解决办法,下边说)}
老老实实对导数积分,不知道积分的可以当成导数的逆向构造,即F′(x)=f(x),求F(x)
∫ (kᵢ-kᵢ₋₁)*H(x-xᵢ₋₁) dx = ∫ (kᵢ-kᵢ₋₁)/2*[1+sgn(x-xᵢ₋₁)] dx =(kᵢ-kᵢ₋₁)/2∫ 1+sgn(x-xᵢ₋₁) =[(kᵢ-kᵢ₋₁)/2]*[x+|x-xᵢ₋₁|]+常数. 而后易看到|x-xᵢ₋₁|
这是什么,这不是在xᵢ₋₁处的折线函数么
回顾下上文 [x-a+|x-a|]/2
xᵢ₋₁左k为-?ᵢ₋₁,xᵢ₋₁右k为?ᵢ₋₁
这说明了k的变化
在经过xᵢ₋₁前,这部分k是-?ᵢ₋₁,经过xᵢ后,k是?ᵢ₋₁.则相差的k值为2?ᵢ₋₁
则斜率变化量是kᵢ₋₁-kᵢ₋₂=2?ᵢ₋₁
所以中间的?ᵢ=(kᵢ₊₁-kᵢ)/2
解决了中间,余下的就好办了,x-a是有对称性的,把绝对值全展开,?ₙ是未知的,但不用管.
以最左边看 k₁=?₁-?₂-?₃-……
以最右边看 k末=?₁+?₂+……
则?₁=(k₁+k末)/2
即y=(k₁+k末)/2*x+[(k₂-k₁)/2*abs(x-x₁)]+……+[(kᵢ-kᵢ₋₁)/2*abs(x-xᵢ₋₁)] (这里ᵢ₋₁是因为发射点也算过的定点,前面还是×[(改变后的k-改变前的k)/2]
化简一下(不要乘0.5,要除2,省1个字符),得到了f(x)模式的万能公式(60s拐6~10次差不多): [(k₁+k末)x+(k₂-k₁)|x-x₁|+……]/2
一阶导(方向场)万能公式(60s拐4~7次大概): [(k₁+k末)+(k₂-k₁)sgn(x-x₁)+……]/2
二阶导时,所有斜率相同的函数都不可用了(一阶导一样).因为公式对决暂不支持δ(x).所以所有含绝对值的函数都无法在二阶相轨迹(二阶导)模式使用
有两个应对办法:
①二阶导(相轨迹)超长(是的,单段都很长,且是极近似100%,而非真100%过定点了,只是为了弥补论坛导函数模式空缺而诞生)公式[把abs当成根号下x²不可二阶导,那我们小小加个数,根号下(x²+小数)就可以无限阶可导了]:
设小数为0.01.则
f″(x)= {[k₂-k₁]/[(x-x₁)²+0.01]^1.5+[k₃-k₂]/[(x-x₂)²+0.01]^1.5+……}/200
其中f′(0)={k₁+k末-[x₁(k₂-k₁)]/(x₁^2+0.01)^½-x₂(k₃-k₂)/(x₂^2+0.01)^½-……}/2
②二阶导万能公式(尝试不同形式,万一哪种形式可以被游戏引擎识别呢)[尝试中]
由上面的近似万能公式,可以延伸到n阶导近似万能公式,增项取得越小准度越高
这个公式是可以从数学层面证明较优的:
①插值阶数:1阶插值,是指哪打哪的最低可用阶.0阶无法连接两点,其余难算或龙格
②参数个数:要经过n+1(起始点一个)个定点,至少要有n+1个参数(xₙ是确定的横坐标,不算),万能公式也刚好是n+1或n(最后一段k任取,可以舍一个准确参数.这是个特例,不是通用的下限.通用下限仍然是 2n+1,因为可以选择命中后继续拐)
③误差累积:每个点都相互独立,误差不会影响下一个经过的点(注意:是在点选错的情况下,如果你加了别的公式,整体上加下减,因为它绝对精确,则每一个经过的点都会同等改变!)
④公式长度: ()/2 4字符;Ax 0~2字符;±Babs(x-xₙ) 10字符. 每个量都是单独信息,无法化简(有些式子看着比这简,实则数更长/难算)
⑤计算要求:数格子比例(k)或估点直接代入(k=△y/△x).计算量≈0
唯一舍弃:
光滑度:可以通过内部嵌套或窗函数等方法达成,但是由于优点②和④,公式必定会变长.(完全舍弃光滑度换取最多的拐点数量,又可以通过多拐点拟合出曲线)
这里k是斜率,如果你取常数,它必然是折线.但不代表它不能突变出任意函数!
有没有什么办法真正打出曲线而不靠拟合呢?
糯米说过:sin[ (x-a+abs(x-a)/2]
有人会想:我在[a,b]令绝对值函数k=0,sin(x)出现,它不就可以么
好的,有问题了:
1.从a请出来了,怎么在b处收回?
有人想:sin(x-a+|x-a|-x-b-|x-b|)=sin(-a-b+lx-al-|x-b|) 这类可以么?不行,间隔不是周期整数倍时会导致左右不齐,对于粗略估计的公式还好,对于绝对精确的万能公式影响是致命的(如果某个拐点变了,则它必定不会经过后面的拐点)
这个解决方法是:
①多层嵌套函数
以超越函数f(x)举例,内部嵌入多拐点绝对值函数
举个简例,即:
f(三拐点万能公式).f(x)在(-∞,a]=0;(a,b)=f(kx);[b,+∞)=0
可是,如果函数没零点呢?
上加下减
如果零点不好找呢?
②窗函数
①嵌套限制还是太大了,我们想一下,如果在(a,b)=1,(-∞,a]U[b,+∞)=0.再乘想表现的函数不就好了
可以做一个四拐点的绝对值折线函数.即:
[(0+0)*x+(1/多久变为1-0)*|x-a|+(0-1/多久变为1)*|x-a-多久变为1|+(-1/多久归0-0)*|x-b|+(0--1/多久归0)*|x-b-多久归0|]/2
用它乘以任意函数,都是在(a,b)显示被乘函数,在(-∞,a]U[b,+∞)=0
③垫脚式一
前面这些,太麻烦了.(二次函数代替)
想一下,我们构造窗函数,分段函数是为了什么?为了截取部分函数让万能公术拐曲线.可为什么非要借助窗或分段呢?把折线扭成曲线不就好了.
想想(x-a+|x-a|)/2,类比出[(x-a)(b-x)+|(x-a)(b-x)|]/2.让二次函数>0时为原函数,≤0时为0
这是可以的,但二次函数本身是渐变的,不易准确算过哪点.而且相比苏珺亭的分段,绝对值+二次函数的分段更长,没什么存在的意义
2.我要是这么用,是必过拐点了,可怎么确定必定经过了哪些点?模糊的话不就和其余函数一样了么?
将拐点定在目标点?(可那样我弯曲有什么用)
再来个小更新,后面还会有
[受小糯米评论区中"佩恩"的评论启发,优化了一个公式中的-p.这个并不是严格相等,是因为游戏本身特性(还是平移)导致图像一样.仅分母为常数项可用!除了我标明的这个,其余用都会导致突变出界]

旧版仅折线七折点效果图

优化后最多25拐点(理论无限,不过游戏限制输入长度256.它拐25次正好256)(别的函数最多6次)
至于常数项,游戏已经平移好了,不用计算
以上都是相对坐标或者绝对坐标算完后平移
Y(x)=f(x-x₀)+y₀-f(0)[能看到这其实不用我说]
到了这个地步,知道斜率和相对拐点距离就够了,直接数格子,不用算,代进去就可以了,优化了计算时间不够的问题
<对于数学来说,这就是万能公式了,只要能连出一条不回折的线(即没有死路),就能一次赢(建议人机最高难度用这个
)(真有死路什么公式都不行……)>
)(真有死路什么公式都不行……)>fw提醒您:形缺数时难入微.一个好的眼力才是胜利的第一要素.估的不准,公式白推.
引用下@爱睡觉的小糯米的观测结果:一个格子的单位长度是2.5
[os:我(fw)发现了一个近乎100%成功且绝对无法反制的作弊方案.但这并不太小,我写下了(你猜猜为什么禁用了复制粘贴)
]
]



![[重置版]公式对决PVP从入门到完结截图](https://img2-tc.tapimg.com/moment/etag/FrFAEiUzJX2zqWVNmDBxdWr-wQ6T_20260803142149.png/_tap_ugc_m.jpg)






