求解给定离散函数的常微分方程组(matlab)

求解给定离散函数的常微分方程组(matlab),matlab,function,ode,Matlab,Function,Ode,这一次我的问题是基于几个月前我问的一个老问题(请参阅),如果您不想重复我的第一个问题,我可以简要介绍一下这个问题 在我的第一个问题中我有两个向量,第一个fx包含函数值: fx = [0.5644 0.6473 0.7258 0.7999 0.8697 0.9353 0.9967 1.0540 1.1072 1.1564 ... 1.2016 1.2429 1.2803 1.3138 1.3435 1.3695 1.3917 1.4102 1.4250 1.4362 ...

这一次我的问题是基于几个月前我问的一个老问题(请参阅),如果您不想重复我的第一个问题,我可以简要介绍一下这个问题

在我的第一个问题中我有两个向量,第一个
fx
包含函数值

fx = [0.5644 0.6473 0.7258 0.7999 0.8697 0.9353 0.9967 1.0540 1.1072 1.1564 ...
      1.2016 1.2429 1.2803 1.3138 1.3435 1.3695 1.3917 1.4102 1.4250 1.4362 ...
      1.4438 1.4477 1.4482 1.4450 1.4384 1.4283 1.4147 1.3977 1.3773 1.3535 ...
      1.3263 1.2957 1.2618 1.2246 1.1841 1.1403 1.0932 1.0429 0.9893 0.9325 0.8725];
第二个
x
包含函数评估点:

x = 0:0.25:10
这个离散函数
fx
是一个ode,我需要用matlab中的ode45来求解它。但ode45不采用离散函数,因此解决方案是对这两个向量进行插值。然后我可以有一个函数句柄,我可以将它发送到ode45,如下所示:

f = @(xq)interp1(x,fx,xq);
tspan = [0 1];
x0 = 2;
xout = ode45(@(t,x)f(x),tspan,x0);
我现在的问题

fx = [0.5644 0.6473 0.7258 0.7999 0.8697 0.9353 0.9967 1.0540 1.1072 1.1564 ...
      1.2016 1.2429 1.2803 1.3138 1.3435 1.3695 1.3917 1.4102 1.4250 1.4362 ...
      1.4438 1.4477 1.4482 1.4450 1.4384 1.4283 1.4147 1.3977 1.3773 1.3535 ...
      1.3263 1.2957 1.2618 1.2246 1.1841 1.1403 1.0932 1.0429 0.9893 0.9325 0.8725];
这一次,我不是只有一个表示一个常微分方程的方程,我有一个常微分方程的系统,但是,像之前一样,函数是离散的。这意味着我有:

fx1 = [....function values...]
x1 = [...the points where the function fx1 was evaluated...]

fx2 = [....function values...]
x2 = [...the points where the function fx2 was evaluated...]

fx3 = [....function values...]
x3 = [...the points where the function fx3 was evaluated...] 
我需要能够用ode45解决这个ODE系统。但我不能简单地插值每个方程,然后将其发送给ode45,这将是错误的。我需要把这个洞系统发送到ode45

我尝试过不同的事情,但我的编程技能并没有延伸到我能解决这个问题的时间,这就是我寻求帮助的原因

我的猜测解决方案

我相信,如果我使用一个
for loop
只生成一个包含系统3个插值方程的函数句柄,我可以将这个函数句柄发送到ode45。这听起来是个不错的选择吗


PS:如果需要(!),我很乐意发布向量值
fx1、fx2、fx3、x1、x2、x3

定义此函数并将其保存在function\u helper.m中

function result = function_helper(f1, x1, f2, x2, f3, x3, xq)
    result = [
        interp1(x1, f1, xq(1))
        interp1(x2, f2, xq(2))
        interp1(x3, f3, xq(3))
    ];
end
然后像这样整合

f = @(t,xq) function_helper(f1, x1, f2, x2, f3, x3, xq);
tspan = [0 1];
x0 = 1;
xout = ode45(f, tspan, x0);

那些x1,x2,x3是一样的吗?或者至少包含很多类似的元素?为什么你不能分开做呢?至少,似乎您有一个1d系统,为3个不同的函数插值。可以自由选择最小值
x1、x2、x3
,这当然会影响函数值
fx1、fx2、fx3
的输出。我不能单独求解它们的原因是因为
fx1、fx2、fx3
表示一个由
odes
组成的(3x3)系统,其中变量相互依赖<代码>dx1dt=X1^a*X2^b*X3^c;dx2dt=X1^g*X2^f*X3^h;dx3dt=X1^p*X2^q*X3^r。函数
fx1、fx2、fx3
是(3x3)系统方程的右侧。x1、
x2
x3
的尺寸是多少?如果每个函数
f1
f2
f3
都将三维向量映射到一个点,那么似乎每个
fi
应该是
1xN
,每个
xi
应该是
3xN
。这是对的吗?也许我只是看不到,但是x1,x2,x3是如何相互影响的,这不是完全无关的吗?函数fxi在特定点上有解,你只需要对它们进行插值。在我看来,这些xi值的计算方式并不重要。@ChrisTaylor
x1,x2,x3
的维数与
fx1,fx2,fx3
的维数相同。例如:如果
x1
50x1
(我对函数
fx1
进行50点评估)然后
fx1
50x1
如果我插值这两个向量,我将得到一个
50x1
向量。可能更容易想象
x1
沿x轴的点和
fx1
沿y轴的函数值。@CrisTaylor我不知道你是否完全误解了我的问题,因为我需要你发布的东西!我只需要在一个函数中收集插值函数,就可以将其发送到ode45。无论如何,我不能在我的编辑器中创建函数,当我尝试创建函数时,我得到一个错误:函数定义在此上下文中是不允许的。@SergioHaram您需要创建一个新文件(
edit function\u helper.m
)并将函数定义保存在那里。然后,您可以在命令窗口中使用
function\u helper(args)
调用它。