【问题标题】:Declaring a functional recursive sequence in Matlab在 Matlab 中声明一个函数递归序列
【发布时间】: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)、递归函数或其他方式。您似乎还暗示您想要重载您的函数(有多个TAU funcs),但我认为这是不必要的,它使任务比它需要的要困难得多。跨度>
  • @mimocha 这正是我的问题。在许多方面,这是逆迭代。添加数学公式非常困难,但我会编辑我正在尝试做的事情。这是一个计算解析 Tetration 函数的程序。当心数学,它非常高雅。
  • 只是一个注释,它不会帮助你解决你的问题,但你应该知道。 for i =[1,n] 恰好重复循环体两次,i 的值为 1 和 n。如果你想遍历两者之间的所有整数(包括)你需要做for i = 1:n
  • 你还没有永远编程,我是数学初学者。真的没必要道歉。本网站建议在提问时提供minimal reproducible example。您可能需要将我们视为数学的初学者/婴儿并忘记您的实际问题并提供一个简单的函数并说明如果函数的输入是例如 3 输出将是数字序列 6 9 45 68 或者它会是产生序列的函数。因为我们是婴儿,所以不要忘记提供一个例子。帮助我们为您提供帮助。

标签: matlab recursion


【解决方案1】:

这是你要找的吗?

function out = tau(z,n)
    % Ends recursion when n == 1
    if n == 1
       out = log(beta(z+1,1)) - beta(z,1);
       return
    end

    out = log(beta(z+1,n) + tau(z+1,n-1)) - beta(z,n);
end

function f = beta(z,n)
    f = 0;
    for i = 0:n-1
        f = exp(f) / (1 + exp(log(2)*(n-i-z)));
    end
end

这基本上是您最近编辑的代码,但我在tau 函数中添加了一个简单的catch。我尝试运行您的代码,发现n 无限递减(无退出条件)。

修改后,代码可以在我的笔记本电脑上成功运行更小的整数值n,其中1e5 > n >= 1;对于z 的浮点值,实数和复数。因此,不幸的是,代码会因n 的浮动值而中断,因为我不知道要返回什么值,例如tau(1,0)tau(1,0.9)。如果您知道数学,这应该很容易解决。

但是,我得到的许多值都是NaNs 或Infs。所以我不确定你最初的问题是Out of memory 错误(无限递归),还是值爆炸到无穷大/NaN(数值稳定性问题)。

Here is a quick 100x100 grid calculation I made with this code.

Then I tested on negative values of z, and found the imaginary part of the output to looks kinda cool.

更不用说我对 pi 也出现在虚数部分的事实有点奇怪:)

tau(-0.3,2) == -1.45179335740446147085 +3.14159265358979311600i

【讨论】:

  • 是的!这正是我一直在寻找的!是的,NAN 是预期的。同样,beta 函数像迭代指数一样增长,溢出错误是意料之中的——想象它像 1、e、e^e、e^e^e、e^e^e^e、...函数 tau 不接受 n 中的复杂参数,只接受自然数(它是复杂函数的序列)。您看到的 pi 是因为我们在这里记录了一个负数。大概 matlab 使用主要分支。我主要只是想看看我是否可以使用这个 tau 函数来逼近我真正想要的 tau 函数。这看起来很棒,谢谢!
  • 再次感谢!我对其进行了按摩,并得到了它来生成我正在寻找的图表!我只需要移动索引(我从 log(beta(z+1,2)) - beta(z,2); 开始,因为它更有利于迭代)。你不知道我对试图找到一种方法来绘制这些函数有多沮丧,哈哈!再次感谢,我希望我能给你更多的代表!
  • 嘿,我把我论文的所有代码都收集到了一个 GitHub 页面中:github.com/JmsNxn92/Recursive_Tetration 如果你想被引用,请告诉我。
  • @RichardDiagram 嘿,谢谢你的提问,但我完全没有被引用。我很高兴在互联网上帮助随机的陌生人:)
  • 这就是我的想法,只是覆盖了我的基础:)
猜你喜欢
  • 2015-06-02
  • 2019-06-13
  • 2011-09-04
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多