【发布时间】:2021-04-18 07:18:05
【问题描述】:
我想首先声明,我是一名数学家。这可能是一个愚蠢的愚蠢问题;但我已经阅读了所有的 matlab 教程——它们让我无处可去。我想我可以用 C 来编码(这会很累);但我需要 matlab 来完成这个特定的功能。而且我不知道该怎么做。
这是我遇到麻烦的粘贴 Matlab 代码:
function y = TAU(z,n)
y=0;
for i =[1,n]
y(z) = log(beta(z+1,i) + y(z+1)) - beta(z,i);
end
end
(beta 是具有索引 i 的任意“浮动”到“浮动”函数。)
我在将 y 声明为函数时遇到问题,我们在其中以不同的参数调用该函数。我想用 y_{n-1}(z+1) 来定义 y_n(z)。这一切都是在递归过程中完成的,以创建函数。我真的觉得我错过了一些愚蠢的东西。
作为一个默认函数,它将 y 分配为一个数组(或任何你称之为默认索引分配的东西)。但我不想要一个数组。我希望将 y 分配为“函数”类(即,将“float”转换为“float”)。然后我定义了一个 y_n 序列:“float”到“float”。所以 z 到 z+1 是“float”到“float”的映射。
不知道是不是对matlab的要求太高了……
帮助一位自 X-box 模组的辉煌时代以来就没有编码过的可怜的数学家。
...请不要告诉我,我必须回到 Pari-GP/C 绘图板上,因为一些如此愚蠢的事情。
请帮忙!
编辑:应 rahnema1 & mimocha 的要求,我将描述数学,以及我试图用我的程序做什么。我看不到如何在这里实现乳胶。所以我会在生成器中编写乳胶代码并上传图片。我不确定是否有办法解决我想做的事情。
关于预期的输出。我们想要,
beta(z+1,i) + TAU(z+1,i) = exp(beta(z,i) + TAU(z,i+1))
我们希望将 i 增加到一个固定值 n。再说一次,我还没有永远编程,所以如果我说的有点荒谬,我很抱歉。
EDIT2:
所以,正如@rahnema1 所建议的那样;我应该制作一个可重现的例子。为此,我将为我的 beta 函数编写代码。这出乎意料地简单。这是针对“乘数”变量设置为 log(2) 的情况;但您无需担心这些。
function f = beta(z,n)
f=0;
for i = 0:n-1
f = exp(f)/(1+exp(log(2)*(n-i-z)));
end
end
这对于 z 一个不大于 4 的浮点数可以正常工作。一旦你使 z 变大,它就会开始溢出。例如,如果你输入,
beta(2,100)
1.4242
beta(3,100)
3.3235
beta(3,100) - exp(beta(2,100))/(1/4+1)
0
100 的意义,就是我们执行了多少次迭代;它收敛速度很快,因此即使将其设置为 15 左右仍然会产生相同的数值精度。现在,我想要的 TAU 的预期输出非常简单,
TAU(z,1) = log(beta(z+1,1)) - beta(z,1)
TAU(z,2) = log(beta(z+1,2) + TAU(z+1,1)) - beta(z,2)
TAU(z,3) = log(beta(z+1,3) + TAU(z+1,2)) - beta(z,3)
...
TAU(z,n) = log(beta(z+1,n) + TAU(z+1,n-1)) -beta(z,n)
我希望这会有所帮助。我觉得应该有一种简单的方法来编写这个序列,而且我一定遗漏了一些明显的东西;但也许这在 Matlab 中是不可能的。
根据 mimocha 的建议,我将研究尾端递归。我希望上帝我不必回到 Pari-gp;但看起来我可能不得不这样做。不期待深入研究该语言,哈哈。
再次感谢!
【问题讨论】:
-
除了示例输入和预期输出之外,如果您提供数学公式将会很有帮助。
-
我觉得我几乎得到了你想要达到的目标,但措辞让我感到困惑,所以请详细说明(如果可能,添加等式)。我现在看到的问题是您正在尝试获取
y(z+1),但它没有定义。您需要定义一个端点y(N),然后向后工作y(N-1), y(N-2), ... y(z)、递归函数或其他方式。您似乎还暗示您想要重载您的函数(有多个TAUfuncs),但我认为这是不必要的,它使任务比它需要的要困难得多。跨度> -
@mimocha 这正是我的问题。在许多方面,这是逆迭代。添加数学公式非常困难,但我会编辑我正在尝试做的事情。这是一个计算解析 Tetration 函数的程序。当心数学,它非常高雅。
-
只是一个注释,它不会帮助你解决你的问题,但你应该知道。
for i =[1,n]恰好重复循环体两次,i的值为 1 和n。如果你想遍历两者之间的所有整数(包括)你需要做for i = 1:n。 -
你还没有永远编程,我是数学初学者。真的没必要道歉。本网站建议在提问时提供minimal reproducible example。您可能需要将我们视为数学的初学者/婴儿并忘记您的实际问题并提供一个简单的函数并说明如果函数的输入是例如 3 输出将是数字序列 6 9 45 68 或者它会是产生序列的函数。因为我们是婴儿,所以不要忘记提供一个例子。帮助我们为您提供帮助。