下载 App
含绝对值的函数初步
修改于6 小时前889 浏览攻略
高三,停更小半年
游戏类:
数字上下限: (10^-323.6多,2^1023多)
格子长度:2.5
游戏地图高度:29
游戏地图宽度:50
发射函数变换:Y(x)=f(x-x₀)+y₀-f(0)
前前言:过了个月回顾一下,发现之前写的有点屎山了,这次优化一点
前言:绝对值其实被低估太多了.如果你想用别的插值,龙格会干扰你/计算量巨大/因平滑而难以预料;如果你想分段,函数你难以估准.但绝对值不怕这个,它有优点,却不受限制.它可以任意地上、下、右,随意移动而不受任何限制!且准度是100%(因为这是插值法的一种),没有任何方法超越这个准度!而且它兼容性极强,可以随意切出任意函数(不建议用它做复合函数,会增加长度以减少拐点).虽然我是最早发的,但是一切带abs的类似函数在数学上应该都等价于这个,因此,简便才是王道.
设玩家初始的随机坐标为(x₀,y₀)
本贴只讨论了与绝对值相关的函数,请读者们大胆开发.
1.初步了解
首先,认识一下绝对值,它在游戏中的体现是: abs
abs(任意函数)=|任意函数|
它的做用是让函数的负值变为正值,也可以说是让函数沿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ᵢ) [反过来也一样]
现在,我们就有了初始斜率与拐点斜率
有了这些,我们先导一次
导数是不连续的分段函数!
虽然知道它分段,可我们怎么表示呢?
绝对值函数的导数图像很容易画出,但怎么用函数写出呢
是的,|x|/x或x/|x|的变式恰好符合,这两个式子在数学中用sgn(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,无法使用}
老老实实对导数积分,不知道积分的可以当成导数的逆向构造,即F′(x)=f(x),求F(x)
∫ (kᵢ-kᵢ₋₁)*H(x-xᵢ) dx = ∫ (kᵢ-kᵢ₋₁)/2*[1+sgn(x-xᵢ)] dx = |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)模式的万能公式: [(k₁+k末)x+(k₂-k₁)|x-x₁|+……]/2
一阶导万能公式: [(k₁+k末)+(k₂-k₁)sgn(x-x₁)+……]/2
这个公式,是可以从数学层面证明较优的:
①插值阶数: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)




