【发布时间】:2017-10-05 12:55:53
【问题描述】:
我正在尝试使用牛顿法(对任何其他方法开放)找出方程约束的根。方程约束取决于具有一个未知项的二次方程的根。方程描述(二次和约束)如下所示。假设二次方程的根为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)
【问题讨论】:
-
我不明白这个约束。是不是缺少一些关系运算符(例如
=, <=, >=;顺便说一句。第一行也不是等式,因为它缺少=)?约束是一个函数,你想找到函数的根吗?如果是,该函数的参数是什么?我只看到常数。如果我理解正确, p1 和 p2 也是常数,因为它们被定义为第一个函数的根。第一行的x和unknown有什么区别? -
方程已更新。您可以单击 EquationImage 链接。两个方程都等于零。 p1 和 p2 是二次方程的根。假设在一个二次方程 ax^2+bx+c 中,假设 b 是未知的。我在第一行说未知的情况也是如此。这就是为什么 p1 和 p2 在我的约束中用 unknown 表示。我想通过我的约束找到未知。
-
你的方程式不清楚。 x 和未知数;所有这些常数都可以组合起来。这是一个糟糕的视觉。你期望从这个等式中得到什么? x 的值和根为零且满足约束的未知数?牛顿对单个方程的根的方法是一回事。方程组的 Newton-Raphson 迭代解是另一个。你想做什么?
-
True 所有这些常量都可以合并为一个。我试图从满足约束方程的二次方程中找到未知的人。如果需要,我愿意接受任何其他方法。
-
我想我得到了你想要做的。第一行实际上是一个函数 f(x)=... 这个函数的根将是 p1 和 p2 (f(p1)=0, f(p2)=0)。这些根将是包含常量和 unknown 变量的表达式。您将这些根替换为您的约束,并希望找到满足约束的 unknown。它是否正确?您知道函数的外观吗,即您是否为合理的常数值绘制了它?牛顿的表现很大程度上依赖于起点。你是怎么选择的?顺便说一句,不要链接到包含文本的图像。