怎麼求一條參數曲線自交形成的交點 ?

怎麼求上面圖中參數曲線自身相交形成的五點坐標?

Matlab code:

t=0:0.1:4*pi;

x=0.24.*cos(t)+0.16.*cos((3/2).*t);

y=0.24.*sin(t)+(-0.16).*sin((3/2).*t);

plot(x,y)

axis equal


精確解的話Mathematica可以直接解出,代碼如下

f[t_] := {6/25 Cos[t] + 4/25 Cos[3/2 t],
6/25 Sin[t] - 4/25 Sin[3/2 t]};
tsol = {ToRules@
Quiet@Reduce[TrigToExp[f[t1] == f[t2]] 0 &< t1 &< t2 &< 4 [Pi]]}; f[t1] /. tsol // FullSimplify // ToRadicals

(感謝@曹洪 的指點,使用TrigToExp以後速度提升了超過10倍)

事實上如果用一些耍流氓的方法的話,這道題是可以筆算的

由圖和三角函數的性質可知這個圖像旋轉對稱以及軸對稱的。旋轉frac{2pi }{5} 後與原圖重合(可以嚴格證明f(t)逆時針旋轉frac{2pi}{5} 後等於f(t+frac{12pi }{5} ),如下圖,不過推導起來會很麻煩)

以及從圖中觀察到圖像與y軸負半軸的交點是一個要求的點,所以只要求出這個點的坐標然後旋轉2次得到上半平面的點,再關於x軸對稱下就能得到另外兩個點

圖像與負半軸的交點滿足frac{3}{2}sin(t)-sin(frac{3}{2}t)=0,用三倍角公式展開一下,得

3sin(frac{1}{2}t)cos(frac{1}{2}t)-3cos^{2} (frac{1}{2}t)sin(frac{1}{2}t)+sin^{3}(frac{1}{2}t)=0\
3cos(frac{1}{2}t)-3cos^{2}(frac{1}{2}t)+1-cos^{2}(frac{1}{2}t)=0

解得cos(frac{1}{2}t)=-frac{1}{4}(由負半軸另一個捨去),代入計算得f(t)={-frac{1}{10},0}

然後再利用旋轉矩陣

left(  egin{array}{ccc}
 cos(frac{2pi}{5})  -sin(frac{2pi}{5})\
 sin(frac{2pi}{5})  cos(frac{2pi}{5})  
end{array}
ight)=left(
egin{array}{cc}
 frac{1}{4} left(-1+sqrt{5}
ight)  -frac{1}{2} sqrt{frac{1}{2}
   left(5+sqrt{5}
ight)} \
 frac{1}{2} sqrt{frac{1}{2} left(5+sqrt{5}
ight)}  frac{1}{4}
   left(-1+sqrt{5}
ight) \
end{array}

ight),

代入計算即可得到5個點


謝邀,這個不是作業吧。

這個問題可以轉化為

f(t)=f(t+Delta)

g(t)=g(t+Delta)

t=(0,4pi)

如果只要數值解,粗暴一點,就是兩重循環,枚舉,就可以找出這5個點了。


謝邀,這個問題的領域不是很熟悉,不過想了想有一個方法說不定可以幫到你:

首先這個問題看成

x(t_1) = x(t_2) \
y(t_1) = y(t_2)

構造一個函數

f(t_1, t_2) = (x(t_1)-x(t_2))^2 + (y(t_1)-y(t_2))^2

然後對這個函數求最小值點應該就可以了,理論上也許能求出精確解,但是微積分什麼的被我忘的差不多了,用一些數值方法求好了。


謝邀。

不知你要數值解還是解析解,總之數值解可以這樣搞,

MATLAB:

clc;clear;

close all

t0 = linspace(0,4*pi,10);

xx = @(tt)(0.24*cos(tt)+0.16*cos((3/2)*tt));

yy = @(tt)(0.24*sin(tt)+(-0.16)*sin((3/2)*tt));

F = @(t)([xx(t(1))-xx(t(1)+t(2)); yy(t(1))-yy(t(1)+t(2))]);

tx = zeros(5,2);

idx = [1 2 3 4 5];

for i = 1:5

t = fsolve(F,[t0(idx(i)) 2.2*pi]);

tx(i,:) = t;

end

tt = 0:0.1:4*pi;

figure;

hold on

plot(xx(tt), yy(tt), "-b");

plot(xx(tx(:,1)), yy(tx(:,1)), "ro");

grid on;

axis equal;

原理上,就是要解g(t,s)=f(t)-f(s)=0這樣的方程。其中,t
e s。在MATLAB中,有自帶的非線性方程求解函數fsolve,可以求出給定初始值附近的解。實際計算時,類似徐騰飛老師的方法,把方程修改為g(t,Delta t)=f(t)-f(t+Delta t)=0的形式,以保證兩個f(x)內的自變數值不同。否則實際程序很可能解出相同的參數值。

目前這個方法的問題是初始值需要手動調整,並且存在一定的敏感度。但是求解速度應該是比較快的,適合已知解的大致位置的情況。


http://mathematica.stackexchange.com/questions/33947/how-to-get-intersection-values-from-a-parametric-graph


可以用lisp在CAD裡面畫出圖形,然後得到交點的坐標,當然是近似的。


如果只針對這個函數求交叉點,而不是用於某個複雜程序中,最簡單的辦法就是:畫出圖形後,把交點附近的區域不斷放大,直接讀數


推薦閱讀:

origin8.0 自定義擬合曲線如何添加誤差線?
在開源軟體中哪些軟體可以與matlab相媲美?
有哪些比較好的數學建模參考書?
matlab求解問題?
什麼是泛化誤差(Generalization error)?

TAG:數學 | 數學軟體 | MATLAB | 數學建模 |