查 发自 凹非寺
量子位 报道 | 公众号 QbitAI
以快速简洁闻名Julia,本身就是为计算科学的需要而生。用它来学习微积分再合适不过了,而且Julia的语法更贴近实际的数学表达式,对没学过编程语音的初学者非常友好。
最近,来自纽约斯塔顿岛学院的数学系教授John Verzani编写了一份微积分与Julia的教程,里面常见的微积分概念和图像演示都有,比课本更生动直观,每个章节后还附习题供读者巩固知识。
虽然很多学校在使用Mathematica、Maple等数学软件在进行教学,但是Julia的优势是完全开源和免费。
准备工作
在使用教程之前,我们先给Julia安装Plots包,这是用来绘制函数图像的扩展包。此外还要安装SymPy科学计算库等其他软件包。
using Pkg Pkg.add("Plots") Pkg.add("SymPy") Pkg.add("Roots") Pkg.add("ForwardDiff") Pkg.add("ImplicitEquations") using Plots plot(sin, 0, 2pi)
安装完以上的扩展包,就可以绘制函数图像了。我们简单绘制0到2π范围的正弦函数图像:
using Plots plot(sin, 0, 2pi)
Julia支持输入特殊数学符号,具体的方法是斜杠\后紧跟符号的LaTeX名称,然后按下Tab键,就能输出特殊字符。比如:
θ=45; v?=200
输入θ的方法是\theta[tab],输入v?的方法是v\_0[tab]。
导数
完成了Julia部分的基本教学后,下面就是微积分的基本概念了。
先回顾一下导数的定义,从函数图像上来看,导数就是函数割线斜率的极限,当割线上两点合并成一点时,它就变为切线。
其实就是求下面的极限:
Julia集成了求极限的功能,对于正弦函数sin(x)而言,求它的导数就是[sin(x+h)-sin(x)]/h在h趋于0时的极限
using SymPy limit((sin(x+h) - sin(x))/ h, h, 0)
通过以上方法求得sin(x)在x=0处的导数为1,绘制成函数图像就是:
f(x)=sin(x) c=0 tl(x)=f(c) + 1 * (x - c) plot(f, -pi/2, pi/2) plot!(tl)
导数的应用
1、牛顿法
通过切线逐步逼近,求方程的近似解。
2、洛必达法则求极限
写成Julia语言:
using SymPy a,x=symbols("a, x", positive=true, real=true) f(x)=sqrt(2a^3*x - x^4) - a * (a^2*x)^(1//3) g(x)=a - (a*x^3)^(1//4)
上面的表达式过于复杂,是0/0的未定式,对分子f(x)和分母g(x)分别分别求导:
fp, gp=subs(diff(f(x),x), x=>a), subs(diff(g(x),x), x=>a)
得到结果
(-4*a/3, -3/4)
所以极限值为16a/9。
积分
定积分就是求函数曲线下包围面积:
上图展示了求定积分的方法:把函数下方图形分割成若干个长条,随着长条越分越细,这些长条的面积之和就越来越接近曲线下包围的面积。
为了求函数f(x)=x2在[0,1]区间里的定积分的近似值,我们把整个区域划分成50000份:
a, b=0, 1 f(x)=x^2 n=50_000 xs=a:(b-a)/n:b deltas=diff(xs) cs=xs[1:end-1] sum(f(cs[i]) * deltas[i] for i in 1:length(deltas))
最后求得结果为:
0.3333233333999998
显然用这种方法求定积分太过复杂,这就需要引入不定积分的概念。不定积分是已知导数f’(x)求原函数f(x)。
定积分与不定积分由牛顿-莱布尼兹公式联系起来:
积分的应用
学会了积分以后,教程里给出了它的几个实际应用案例:
1、求曲线长度
求解f(x)=x2在[0,1]这段区间里的弧长,实际上求积分。
先求不定积分:
using SymPy @vars x F=integrate(sqrt(1 + (2x)^2), x)
F(1)-F(0)就是所求弧长:
2、求体积
求体积的方法是把物体“切”成一圈圈的米其林,每一圈的体积加起来就是总体积。
将直线x/r+y/h=1绕着y轴旋转一周,得到一个底面直径为r,高度为h的圆锥体。
using SymPy @vars r h x y R=r*(1 - y/h) integrate(pi*R^2, (y, 0, h))
最后求得体积:
教程中还有很多其他基本概念,由于篇幅较长,我们就不一一介绍了,感兴趣的朋友可以去博客中进一步学习。
原文地址:
https://calculuswithjulia.github.io/
— 完 —
诚挚招聘
量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。
量子位 QbitAI · 头条号签约作者
?'?' ? 追踪AI技术和产品新动态
Math.sign()方法用于判断一个数的符号,即正负性。它的语法形式如下所示:
Math.sign(x);
参数x即为要对其符号进行判断的那个数,如果你传递的x不是数字(即它的类型不是Number),那么它会先被转换为Number类型。
通俗地说,如果x是正数,则Math.sign()方法返回+1;如果x是负数,则返回-1。具体来说,该方法的返回值由下面的规则决定;如果参数x不是数字,那么这些规则中提到的x的值指的是它被转换为数字后的值。
1. 如果x是NaN,那么结果也是NaN;
2. 如果x是-0,那么结果是-0;
3. 如果x是+0,那么结果是+0;
4. 如果x是负数(不包括-0),那么结果就是-1;
5. 如果x是正数(不包括+0),那么结果就是+1;
注意,+0和+1通常直接显示为0和1,而不显示前面的正号。
本示例将展示参数为各种情况下,Math.sign()方法的返回值;它的执行结果如图1所示。
<script>
/* 参数是Number类型的情况 */
var value1=Math.sign(NaN);
console.log("Math.sign(NaN):");
console.log(value1);
var value2=Math.sign(-0);
console.log("\nMath.sign(-0):");
console.log(value2);
var value3=Math.sign(+0);
console.log("\nMath.sign(+0):");
console.log(value3);
var value4=Math.sign(-6);
console.log("\nMath.sign(-6):");
console.log(value4);
var value5=Math.sign(7);
console.log("\nMath.sign(7):");
console.log(value5);
/* 参数不是数字的情况:
* 字符串"89.22"转换成数字为89.22;
* 布尔值true转换成数字为1;
* window对象转换成数字为NaN。
*/
var value6=Math.sign("89.22");
console.log('\nMath.sign("89.22"):');
console.log(value6);
var value7=Math.sign(true);
console.log("\nMath.sign(true):");
console.log(value7);
var value8=Math.sign(window);
console.log("\nMath.sign(window):");
console.log(value8);
</script>
图1 Math.sign()方法的执行结果
(完)
网页时,最让人烦恼的是自己辛辛苦苦写出来JAVASCRIPT代码常常被别人轻易的拷贝,实在让自己的心里有点不是滋味,要知道自己写点东西也挺累的。
但我们也应该清楚地认识到因为JAVASCRIPT代码是在IE中解释执行,要想绝对的保密是不可能的,我们要做的就是尽可能的增大拷贝者复制的难度,让他知难而退(但愿如此)。
网上有很多JavaScript加密工具,但是很多都是可以被轻易破解的,下面帖子网给大家介绍一种比较奇葩的加密方式
先看效果图
具体方法
1.进入网站(文章结尾有说明)
2.把你的js原代码粘贴进去(先备份文件)
3.复制加密后的代码到对应的js文件替换原代码
关注我的头条号,然后私信我发送:1022 即可获取网站地址。
*请认真填写需求信息,我们会在24小时内与您取得联系。