Julia 求解ODE方程 2

为什么要使用Julia? (这些都是没用的话)

很多人觉得语言只是工具,没有本质区别。其实并不是这样,举个例子,你想编一个大型的程序,其中你只关心你提出的一个方法,而其他大部分功能和方法都只是为了实现,并不是你的创新点,你也没必要真的去学习它们,只需要了解到它们各有什么优点和在做什么就可以了。这种时候就体现出了高级语言站在巨人的肩膀上的优势了,有极多的库和包可以用,甚至你的程序百分九十的功能都是基于别人封装好的包来做的。 这有什么优点呢,第一,节约了你大部分时间,没必要编写和调试本来无需去做的工作,第二,成熟的包和库都经过了大量人力的优化,计算速度和稳定性远远强于你自己短期编的程序,第三,如果是开源的库,如果你有更多的需要,可以在原框架上做自己的修改。

当然,Fortran 和c等初级语言也有现成的代码可以用,比如MKL等商用包,但是用起来真的超级不方便,比如你想实现一个矩阵求逆的运算,需要下载、安装等等一系列繁琐的工作,然后调用时候也很不方便,比如会同时需要给十几个甚至几十个参数输入。另外调用了别人库的程序可移植性变得很差,经常换个系统,换个电脑就无法调试通。 所以大家仍然喜欢自己去编绝大部分功能。 当然,如果是在学习阶段,充分理解某个计算流程,初级语言仍然是很有必要的。

这是高级语言,包括julia的一个优点。 但是,为什么我没有选择Python或者matlab、octave等呢,那就是计算速度问题了, 我将要做的工作大部分和大型计算相关,目前代码基本上都是Fortran和c的,在计算速度方面,FOrtran基本上可以秒空气了,然而,Julia也是为了科学计算开发的,计算速度并不弱于Fortran和c太多,另外,由于Fortran编写中,如果你不考虑优化的话,甚至还没有julia程序快。即便牺牲一点点计算速度,换取更多的个人时间都是非常值得的。

另外julia无需胶水语言就可以编译Fortran,C,Python等代码,代码的继承能力也是极强的。不断完善的各类高性能计算、机器学习的库,以及并行和Gpu等极多的优点,还有更高的可读性,释义型语言的优势等等,都非常具有吸引力。。。

当然,julia上手难度还是颇高的,尤其对于没有任何高级语言经验,只会面向过程编程,需要学习和练习很多,但是我觉得这些都是值得的。另外,julia毕竟只是个才发展10年的语言,目前还缺乏足够多的应用,尤其国内几乎没有公司,只有极少数的个人在使用julia,仍然算是非常小众的东东,但是作为个人应用,真的足够了。 非常看好它的前景。

好了言归正传,在给一个DifferentialEquations求解ODEs方程组的例子,


Lorenz 方程

dxdt=σ(yx)dydt=x(ρz)ydzdy=xyβz d x d t = σ ( y − x ) d y d t = x ( ρ − z ) − y d z d y = x y − β z

同样我们需要先定义函数

    function larenz(du,u,p,t)
        du[1]= 10.0(u[2]-u[1])
        du[2] = u[1] * (28.0-u[3]) -u[2]
        du[3]= u[1]*u[2] - (8/3)u[3]
    end

当然这么写很不好,换一套系数还得改程序不是?

    function larenz(du,u,p,t)
        du[1]= p[1]*(u[2]-u[1])
        du[2] = u[1] * (p[2]-u[3]) -u[2]
        du[3]= u[1]*u[2] - p[3]*u[3]
    end

这样就好多了,然而DE包还给了一个宏可以用,很骚的操作。

        g = @ode_def LorenzExample begin
            dx = σ*(y-z)
            dy = x*(ρ -z)- y
            dz = x*y -β*z
        end σ ρ β

是不是骚气多了,这还不算完,调用ParameterizeFunctions 包还可以实现更骚的操作

g = @odedef Lorenz2 begin
    df₁ = σ*(f₂ - f₃)
    df₂ = f₁*(ρ - f₃) - f₂
    df₃ = f₁*f₂ - β*z
end σ ρ β

如果符号已经不能表达你绝望的写代码的心情了
这里写图片描述

那我们就用emoji吧。当然这有点太浮夸了,我们还是采用g来计算,
第二步,给出初始条件和时间、参数等

g1 = @ode_def Lorenz2 begin
    df₁ = σ*(f₂ - f₃)
    df₂ = f₁*(ρ - f₃) - f₂
    df₃ = f₁*f₂ - β*f₃
end σ ρ β

tspan=(0.0,1.0)
p=[10.0,28.0,8/3]
u0=[1.0,0.0,0.0]

prob=ODEProblem(g1,u0,tspan,p)
sol = solve(prob)
using Plots
plot(sol,vars=(1,2,3))

最后画个三维图,
这里写图片描述

当然这里Plots对字符支持还是有点问题,有时间我再研究下画图的包吧,这个也是非常有必要的,太晚了,睡觉zzz 明天有时间再说。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值