我想用牛頓法找出方程約束的根(對任何其他方法都是開放的)。等式約束取決於具有一個未知項的二次方程的根。公式描述(二次和約束)如下所示。二次方程的根假定爲p1
和p2
。牛頓法
x^2 + x*(c1*unknown/2 + C1*c2)/(c1*c2*c3*unknown/2) + 1/(c1*c2*c3*u/2) = 0
與約束
(1/(p2-p1))*(exp(-0.3*p2) - 1)*(c1*c2 - p2) - (exp(-0.3*p1) - 1)*(c1*c2 - p1) - 0.04 = 0
我想知道是否有任何其他的近似方法,如果牛頓法是不會這樣做來解決這個問題。
MATLAB代碼
p0=10*10^6;
Cc=0.65*10^-6;Rp=100*10^3;Cp=55*10^-9; z1=1/(Cp*Rp);
N = 100;error = 0.02;
syms 'x'
a = 1;
b = ((Cc*(x/2+Rp))/(Cc*Cp*Rp*x/2));
c = 1/(Cc*Cp*Rp*x/2);
poles1 = (-b + sqrt(b^2 - 4*a*c))/(2*a);
poles2 = (-b - sqrt(b^2 - 4*a*c))/(2*a);
p1_subterm = (exp(-0.3*poles1) - 1)*(z1 - poles1);
p2_subterm = (exp(-0.3*poles2) - 1)*(z1- poles2);
f(x) = (1/(poles2 - poles1))*p2_subterm - p2_subterm - 0.04;
df = diff(f);
while i <= N
p = p0-(f(p0)/df(p0))
if (abs(p - p0)/abs(p)) < error
fprintf('Solution is %f \n', double(p))
return
end
i = i + 1;
p0 = p;
end
fprintf('Solution did not converge within %d iterations \n', N)
我不明白的約束。是不是缺少一些關係運算符(如'=,<=, > ='; btw。第一行不是因爲它缺少'='而不是一個等式)?約束是一個函數,你想找到函數的根?如果是的話,這個函數的參數是什麼?我只看到常量。如果我理解正確,p1和p2也是常量,因爲它們被定義爲第一個函數的根。第一行的* x *和* unknown *有什麼區別? –
公式更新。你可以點擊EquationImage鏈接。兩個方程都等於零。 p1和p2是二次方程的根。假設在一個二次方程ax^2 + bx + c中,假設b是未知的。我的情況也是如此,我在第一行中說不詳。這就是爲什麼p1和p2在我的約束下用未知表達的原因。我想通過我的約束找到未知的。 –
你的方程不清楚。 x和未知數;所有這些常數都可以合併。這是一個糟糕的視覺。你期待什麼來擺脫這個等式? x和未知根值爲零且約束滿足的值?牛頓的單方程根源方法是一回事;另一個是方程組的Newton-Raphson迭代解。你想做什麼? – duffymo