2012-10-17 50 views
2

我寫一個MATLAB程序尋找的頻率f_i的所有可能值滿足以下限制:頻率發生器

f1+f2+f3+f4+f5+f6=100 
f2+2*f3+3*f4+4*f5+5*f6=95 

該方案是一個大量的時間,因爲巨大的嵌套的循環,但我無法得到答案,那麼對於這個問題可能的解決方案是什麼?

也是我真正的問題是更加大,我需要所有可能的頻率像150 f_i的類似約束

f1+f2+...+f150=10,000,000 
f2+3*f3+...+17*f150=9,500,000 

那麼,有沒有什麼辦法或技術來解決這樣的問題,如果是那麼如何?

+2

如果沒有超過兩個限制,有解決方案 – JoshRagem

+0

此外,這或許應該被移動到數學或物理等SE網站無限多的。 – JoshRagem

+1

似乎問題是枚舉所有的解決方案,因爲f_1 .. f_n是可能有附加約束的整數(假設它們是頻率)。 – Jakob

回答

1

你不需要循環,你需要線性代數。你有2個線性方程和6個變量。這給你4個自由度。

我假設你的變量是整數約束到一定範圍,否則有無限多的解決方案。

將整數值分配到f1,f2,f3, f4並求解其餘的方程。一種方法是在一定範圍內生成所有整數的四維網格,並解決線性系統。

[f1,f2,f3,f4] = ndgrid(1:10,1:10,1:10,1:10); 
res = [1 1; 4 5] \ ([100-f1(:)-f2(:)-f3(:)-f4(:) 95-f2(:)-2*f3(:)-3*f4(:)]'); 
f5 = res(1,:); 
f6 = res(2,:); 

solutions = [f1(:) f2(:) f3(:) f4(:) f5(:) f6(:)] 
+0

我可以看到它的作品,但我需要的頻率是非零正整數。現在可以實現了嗎? – Niyan

0

你的問題是線性的。因此,你可能做的是以矩陣形式寫出問題,然後尋找矩陣內核 - 這是matlab計算所做的(至少在找到它的方向上,參見例如http://www.mathworks.de/matlabcentral/newsreader/view_thread/45457)。

儘管如此,我們假設頻率是真實的(假設它具有物理意義)。否則問題就更難了。

+0

在我的情況下,頻率是正整數。 – Niyan

1

您給出的示例問題有6個未知數,只有2個方程。在你真正的問題中,你說你可以有150個變量,但仍然只有2個方程。

這些問題嚴重不足,您可以分配給f1--f150以滿足這兩個約束的不同數值。枚舉所有可能的解決方案是毫無意義的 - 您最好爲每個頻率生成一個數組,並且在使用特定組合時檢查約束條件。這樣做效率更高,因爲開頭的約束條件很少。

現在,你說所有f_i都是非零正整數。這仍然沒有幫助,因爲1/0也是一個整數。我假設有一個額外的約束,那就是所有的頻率可能不會大於某個預定義的最大值。

我給你舉例說明我的擔憂。假設最大值爲100.那麼有多少種不同的組合?對於6個不同頻率(如本例中),

num_fi = 100*100*100*100*100*100 = 100^6 = 10^12 = 1 trillion 

組合。對於f_ii = 150

num_fi = 100*100*...150 times...*100 = 100^150 = 10^300 

(這是十到的功率-300!)不同的組合。

假設你想存儲它們。由於1和100之間的整數只消耗1個字節,你必須存儲

[number of combinations] * [number of f_i in the set] * [number of bytes] 
    = [num_fi] * i * 1byte 
    = (10^300 * 150) bytes 
    = 1.5 * 10^290 TERABYTES. 

假如你使用4TB磁碟機,每個硬盤爲1cm高,你需要

3.75 * 10^289 

4TB磁碟機。這些磁碟機,堆放在彼此的頂部時,將創建一個塔,將達到

(3.75*0.01*10^289)/384400000/2 = 4.87 * 10^278 

to the moon和背部,或

(3.75*0.01*10^289)/2.54e6/9.4605284e15/2 = 7.80 * 10^264 

倍至Andromeda galaxy和背部,或

(3.75*0.01*10^289)/13.2e9/9.4605284e15/2  
= 1.50 * 10^261 

UDFj-39546284和背部

由於這是星期五,我會扔在幾個獎金:

的磁碟機將填補了:球體

  • 1.59e + 247倍,在太陽和半徑39AU中心(到冥王星)
  • 3.75e + 222倍球體,以SMB爲中心,半徑爲100,000光年(整個星系)
  • 1.39e + 207倍球體,以地球和半徑爲中心139億光年(可觀察的宇宙)

而這僅僅是爲了100

最大值所以這是真的不多,我們可以在這裏做,除非你給我們你想與f_i的完成什麼更多的上下文

+0

是的,MATLAB會爲大多數頻率分配很多零,但我不需要這樣的解決方案。頻率必須是滿足這些條件的非零正整數。我們是否可以不運行一個程序來枚舉符合這兩個條件的所有可能的組合 – Niyan

+0

@Niyan:查看我的最新編輯。 –

+0

只是一個快速的點 - >'100^6 = 10 million' –