gpt4 book ai didi

matlab - 在 Matlab 中声明函数递归序列

转载 作者:行者123 更新时间:2023-12-04 07:47:22 24 4
gpt4 key购买 nike

我想首先声明,我是一名数学家。这可能是一个愚蠢的愚蠢问题;但我已经阅读了所有的 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 的任意“ float ”到“ float ”函数。)
我在将 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 mods 的辉煌时代以来就没有编码过的可怜的数学家。
...请不要告诉我我必须回到 Pari-GP/C 绘图板上来处理如此愚蠢的事情。
请帮忙!
编辑:在 rahnema1 和 mimocha 的要求下,我将描述数学,以及我想用我的程序做什么。我看不到如何在这里实现 latex 。所以我将在生成器中编写 latex 代码并上传图片。我不太确定是否有解决我想做的事情的方法。
enter image description here
至于预期的输出。我们想要,

beta(z+1,i) + TAU(z+1,i) = exp(beta(z,i) + TAU(z,i+1))


我们希望将 i 增长到固定值 n。再说一次,我没有永远编程,所以如果我说的有点荒谬,我深表歉意。
编辑2:
所以,正如@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 a 不大于 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;但看起来我可能不得不这样做。不期待对该语言进行深入研究,哈哈。
再次感谢!

最佳答案

这是你想要的?

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 中添加了一个简单的捕获功能。我尝试运行您的代码并注意到 n无限递减(无退出条件)。
通过修改,代码在我的笔记本电脑上成功运行,用于较小的整数值 n ,其中 1e5 > n >= 1 ;以及 z 的浮点值,真实而复杂。因此,不幸的是代码会因 n 的浮点值而中断。 ,因为我不知道返回什么值,比如 tau(1,0)tau(1,0.9) .如果您知道数学,这应该很容易解决。
但是,我得到的许多值都是 NaN s 或 Inf s。所以我不确定您最初的问题是否是 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

关于matlab - 在 Matlab 中声明函数递归序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67146061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com