<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>程式設計 遇上 小提琴 &#187; 導公式</title>
	<atom:link href="http://blog.ez2learn.com/tag/%e5%b0%8e%e5%85%ac%e5%bc%8f/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ez2learn.com</link>
	<description>Victor&#039;s個人部落格，關於程式設計與小提琴</description>
	<lastBuildDate>Tue, 07 Feb 2012 03:26:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>用Python幫你進行代數運算 : Sympy</title>
		<link>http://blog.ez2learn.com/2009/08/25/sympy/</link>
		<comments>http://blog.ez2learn.com/2009/08/25/sympy/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 14:26:05 +0000</pubDate>
		<dc:creator>victor</dc:creator>
				<category><![CDATA[中文文章]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[導公式]]></category>
		<category><![CDATA[代數運算]]></category>
		<category><![CDATA[CAS]]></category>
		<category><![CDATA[computer algebra system]]></category>
		<category><![CDATA[Sympy]]></category>
		<category><![CDATA[數學]]></category>

		<guid isPermaLink="false">http://blog.ez2learn.com/?p=723</guid>
		<description><![CDATA[最近因為接到的Case，滿腦子中都是線性代數的東西，程式中有太多東西需要計算，以前學過的東西全都從腦子裡挖了出來，不過我通常都不背公式的，我所做的都是將當時走過的思路再走過一次，把公式重新導出來，因為公式是一個點，忘記就沒了，而思路是一條線，只要抓到了就可以得到同樣的結果 我還記得有一次，在PTT站上問一個微積分的式子是怎麼來的，因為我在書上看到他經過一個很奇怪的上下乘某個三角函數，式子就莫名奇妙的跑出來了，有個台大的學生很不以為然的回答，就是上下相乘那三角函數阿，當時讓我覺得挺無言的，這我當然也知道，看書也知道，問題是在於，如果沒有書跟你講，你是怎樣能想到這神來一筆，知道要上下乘這個函數? 所以公式的結果從來都不是重點，重點在於思路，只死記公式最後都會忘光光，但是能夠思考而走到公式這一步的話，就好像走過一條路，找到片段，又能找到終點，死記公式，就好像把你丟到一個定點，要你記住那裡長什麼樣子，一個是點，一個是一條路，當然是思路記得比較好 這種想法讓我到了應用時通常都能用上我所學到的，因為我知道那些東西從哪裡來的，即使忘記了也可以再導出來，但同時有些時候也讓我吃足了苦頭，還記得有一次考物理時，前面半節課我在導公式，後面半節用導出來的公式算，下場當然很慘，其實很多時候公式寫到一個地方，剩的就只剩整理，但是這過程卻很煩人、機械化，很容易一個正負號，一個看走眼就會讓後面的過程全部跟著錯掉，所以不得不在過程中每個符號小心的重寫一次，長久以來我一直在想，即使是整理也是有規則的，為什麼不能用電腦來算呢? 雖然我知道有matlab這類的東西，畢竟沒時間學，領域也不太一樣，不合胃口，直到前陣子在PTT的Python版上看見有人推薦一款Python的library : Sympy，他是一款Python寫的代數運算函式庫，舉個例子你寫出了一個式子，想知道它的導函數是什麼，你只要先將式子列出來，再用一個函數呼叫，他就可以把導函數算出來，這非常地合我喜好，我們現在就來介紹如何使用Sympy來幫你計算兩線在平面交一點的公式 兩線交一點 首先我們在平面上有P1和P2兩點，而從P1出發的是u向量，從P2出發的是v向量，我們想得知這兩條線在哪裡會交一點，就必須這麼算，我們設t和s為實數，我們可以找到一個等式P1 + su = P2 + tv，也就是P1以u的速度走s秒(秒只是幫助想像的假設)，P2以v的速度走t秒，兩人會撞在一起，要導公式就要先找等式，這就是我們公式的等式，一開始我不知道是程式寫太多還怎樣，突然有點腦殘的想說，奇怪，這式子有兩個未知數s和t，一條式子算不出兩個未知數阿? 後來才突然想到，我忘了這是平面，所以在x分量和y分量上面我們各有一條這樣的等式，有了兩條等式，兩個未知數才可能有解 有了等式之後，嘿嘿，就是該交給電腦的時候了 from sympy import * &#160; p1x = Symbol&#40;'p1x'&#41; p1y = Symbol&#40;'p1y'&#41; &#160; p2x = Symbol&#40;'p2x'&#41; p2y = Symbol&#40;'p2y'&#41; &#160; ux = Symbol&#40;'ux'&#41; uy &#8230; <a href="http://blog.ez2learn.com/2009/08/25/sympy/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>最近因為接到的Case，滿腦子中都是線性代數的東西，程式中有太多東西需要計算，以前學過的東西全都從腦子裡挖了出來，不過我通常都不背公式的，我所做的都是將當時走過的思路再走過一次，把公式重新導出來，因為公式是一個點，忘記就沒了，而思路是一條線，只要抓到了就可以得到同樣的結果</p>
<p>我還記得有一次，在PTT站上問一個微積分的式子是怎麼來的，因為我在書上看到他經過一個很奇怪的上下乘某個三角函數，式子就莫名奇妙的跑出來了，有個台大的學生很不以為然的回答，就是上下相乘那三角函數阿，當時讓我覺得挺無言的，這我當然也知道，看書也知道，問題是在於，如果沒有書跟你講，你是怎樣能想到這神來一筆，知道要上下乘這個函數? 所以公式的結果從來都不是重點，重點在於思路，只死記公式最後都會忘光光，但是能夠思考而走到公式這一步的話，就好像走過一條路，找到片段，又能找到終點，死記公式，就好像把你丟到一個定點，要你記住那裡長什麼樣子，一個是點，一個是一條路，當然是思路記得比較好</p>
<p>這種想法讓我到了應用時通常都能用上我所學到的，因為我知道那些東西從哪裡來的，即使忘記了也可以再導出來，但同時有些時候也讓我吃足了苦頭，還記得有一次考物理時，前面半節課我在導公式，後面半節用導出來的公式算，下場當然很慘，其實很多時候公式寫到一個地方，剩的就只剩整理，但是這過程卻很煩人、機械化，很容易一個正負號，一個看走眼就會讓後面的過程全部跟著錯掉，所以不得不在過程中每個符號小心的重寫一次，長久以來我一直在想，即使是整理也是有規則的，為什麼不能用電腦來算呢? 雖然我知道有matlab這類的東西，畢竟沒時間學，領域也不太一樣，不合胃口，直到前陣子在PTT的Python版上看見有人推薦一款Python的library : <a href="http://code.google.com/p/sympy/">Sympy</a>，他是一款Python寫的代數運算函式庫，舉個例子你寫出了一個式子，想知道它的導函數是什麼，你只要先將式子列出來，再用一個函數呼叫，他就可以把導函數算出來，這非常地合我喜好，我們現在就來介紹如何使用Sympy來幫你計算兩線在平面交一點的公式</p>
<h2>兩線交一點</h2>
<p>首先我們在平面上有P1和P2兩點，而從P1出發的是u向量，從P2出發的是v向量，我們想得知這兩條線在哪裡會交一點，就必須這麼算，我們設t和s為實數，我們可以找到一個等式P1 + su = P2 + tv，也就是P1以u的速度走s秒(秒只是幫助想像的假設)，P2以v的速度走t秒，兩人會撞在一起，要導公式就要先找等式，這就是我們公式的等式，一開始我不知道是程式寫太多還怎樣，突然有點腦殘的想說，奇怪，這式子有兩個未知數s和t，一條式子算不出兩個未知數阿? 後來才突然想到，我忘了這是平面，所以在x分量和y分量上面我們各有一條這樣的等式，有了兩條等式，兩個未知數才可能有解</p>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2009/08/f1.JPG"><img class="alignnone size-medium wp-image-724" title="f1" src="http://blog.ez2learn.com/wp-content/uploads/2009/08/f1-300x235.jpg" alt="f1" width="300" height="235" /></a></p>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2009/08/f2.JPG"><img class="alignnone size-medium wp-image-725" title="f2" src="http://blog.ez2learn.com/wp-content/uploads/2009/08/f2-300x235.jpg" alt="f2" width="300" height="235" /></a></p>
<p>有了等式之後，嘿嘿，就是該交給電腦的時候了</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> sympy <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
&nbsp;
p1x = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'p1x'</span><span style="color: black;">&#41;</span>
p1y = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'p1y'</span><span style="color: black;">&#41;</span>
&nbsp;
p2x = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'p2x'</span><span style="color: black;">&#41;</span>
p2y = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'p2y'</span><span style="color: black;">&#41;</span>
&nbsp;
ux = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'ux'</span><span style="color: black;">&#41;</span>
uy = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'uy'</span><span style="color: black;">&#41;</span>
&nbsp;
vx = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'vx'</span><span style="color: black;">&#41;</span>
vy = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'vy'</span><span style="color: black;">&#41;</span>
&nbsp;
s = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'s'</span><span style="color: black;">&#41;</span>
t = Symbol<span style="color: black;">&#40;</span><span style="color: #483d8b;">'t'</span><span style="color: black;">&#41;</span>
&nbsp;
fx = p1x - p2x + s<span style="color: #66cc66;">*</span>ux - t<span style="color: #66cc66;">*</span>vx
fy = p1y - p2y + s<span style="color: #66cc66;">*</span>uy - t<span style="color: #66cc66;">*</span>vy
&nbsp;
sol = solve<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>fx, fy<span style="color: black;">&#41;</span>, s, t<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'s:'</span>
<span style="color: #dc143c;">pprint</span><span style="color: black;">&#40;</span>sol<span style="color: black;">&#91;</span>s<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'t:'</span>
<span style="color: #dc143c;">pprint</span><span style="color: black;">&#40;</span>sol<span style="color: black;">&#91;</span>t<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>就是這樣簡單直覺，你可以先去吃個飯等他算完嗎? 不，連屁股都還沒挪開椅子就算完了</p>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2009/08/formula.png"><img class="alignnone size-medium wp-image-726" title="formula" src="http://blog.ez2learn.com/wp-content/uploads/2009/08/formula-300x198.png" alt="formula" width="300" height="198" /></a></p>
<h2>最後</h2>
<p>附上一張用小畫家手導公式的惡心算式圖，高下立判，我當時算出了t，正想說要把t代回公式裡算出s時就頓時覺得頭皮發麻，好煩喔，於是就找了sympy來試用，果然一眨眼的功夫，我式子列完了，公式也算完了，就是這樣!</p>
<p><a href="http://blog.ez2learn.com/wp-content/uploads/2009/08/scribble_formula.png"><img class="alignnone size-medium wp-image-727" title="scribble_formula" src="http://blog.ez2learn.com/wp-content/uploads/2009/08/scribble_formula-300x299.png" alt="scribble_formula" width="300" height="299" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ez2learn.com/2009/08/25/sympy/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

