查 發自 凹非寺
量子位 報道 | 公眾號 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小時內與您取得聯系。