Re: [問題] 解完聯立無法直接得到值

作者: ejialan (eji)   2018-07-10 10:14:09
※ 引述《ccam (′・ω・`)》之銘言:
: 遇到的問題是
: 透過兩條由連接兩個點的線來找交點
: 都是簡單的二元一次線性方程式
: 但是方程式的斜率和常數會需要一直改變
: 所以先用下面的方法測試
: 但是得出的交點卻顯示代數而不是直接顯示數值
: 想要看數值必須把那串代數答案重新輸入才看的到
: 有沒有辦法在跑的過程中直接得到數值答案?
: 變成:
: x=4
: y=4
: 這樣。
: 感謝。
: 程式碼:
: %Line_1
: x1=0;
: y1=0;
: x2=8;
: y2=8;
: a = polyfit([x1,x2],[y1,y2],1);
: %Line_2
: x3=0;
: y3=8;
: x4=8;
: y4=0;
: b = polyfit([x3,x4],[y3,y4],1);
: value_ax = a(1,1); %Line1斜率
: value_ay = a(1,2); %Line1常數
: value_bx = b(1,1); %Line2斜率
: value_by = b(1,2); %Line2常數
: syms x y
: [x,y] = solve('y = value_ax * x + value_ay','y = value_bx * x + value_by')
: 結果:
: x =
: -(value_ay - value_by)/(value_ax - value_bx)
: y =
: (value_ax*value_by - value_ay*value_bx)/(value_ax - value_bx)
法1:
問題在於你的寫法不會幫你把值代入字串
你可以把你solve裡的字串貼到Command Window執行
會發現你value_ax等變數還是保留成字串
要代入的話要使用num2str把數值轉成字串如下
[x,y] = solve(['y=' num2str(a(1,1)),'*x+',num2str(a(1,2))],['y=',...
num2str(b(1,1)),'*x +', num2str(b(1,2))])
法2:
solve也可以吃符號變數
所以可以把要解的方程式令成eq1=0,eq2=0的形式
syms x y
eq1=a(1,1)*x+a(1,2)-y;
eq2=b(1,1)*x+b(1,2)-y;
[x,y]=solve(eq1,eq2)
法3:
既然是線性方程可以整理成矩陣Ax=b的形式
然後x=A\b
A=[a(1,1) -1
b(1,1) -1];
bb=-[a(1,2);b(1,2)];
xy=A\bb
法4:
其實你解出來的結果就是沒代值的代數解
用subs或eval就可以把值代入了
所以最後加個
x=subs(x)
y=subs(y)

x=eval(x)
y=eval(y)
注意每個方法解完的變數型態略有不同
solve、subs出來會是符號變數
左除(\)、eval會是浮點數
作者: ccam (C.C.C)   2018-07-10 13:40:00
大感謝!!!

Links booklink

Contact Us: admin [ a t ] ucptt.com