如何在不使用符号计算的情况下解决问题

计算科学 matlab 非线性方程 迭代法 一体化 符号计算
2021-12-11 17:38:45

我有以下只有两个未知数的简单非线性方程:

{12ea1x+a2x31+x2dx=112x2ea1x+a2x3dx=13

我了解在复杂领域中获得所有可能的数值解几乎是不可能的C. 因此,任何具有足够准确度的特定给定初始值的数值复数解都是可以的。

通过符号-数值计算,很容易得到一个解:

{a1=2.0836199819220752.163052112144277ia2=0.144311264409679+1.206590594556891i

但是,我发现很难使用 Matlab 中的内置积分函数来处理这样的问题,因为这些 integralquadgk函数仅接受function handle-form 被积函数。

我的尝试是首先将非线性方程组合成用户定义的函数,然后使用特定的初始值按迭代算法(例如牛顿法)求解它),但是当我尝试传递符号变量或全局变量时a1,a2,会发生问题(错误消息)。

虽然符号计算可以得到一个解,但它太慢了,尤其是对于更一般的非线性方程。由于我需要的解决方案只是数字解决方案,我想知道:

是否可以在不使用符号计算的情况下通过 Matlab 解决这样的问题?如果积分函数必须接受符号a1,a2,如何在 Matlab(或 C++)中处理它?

1个回答

您可以在 Python 中以数字方式解决此问题,而无需符号计算。

从 __future__ 导入 print_function,除法
将 numpy 导入为 np
从 numpy 导入 exp
从 scipy.integrate 导入四边形
从 scipy.optimize 导入根目录

定义 f1(a1,a2,x):
    返回 exp(a1 * x + a2 * x * x * x) / (1 + x * x)

定义 f2(a1,a2,x):
    返回 exp(a1 * x + a2 * x * x * x) * x

定义 g(a1, a2, f):
    定义 r(x):
        返回 f(a1, a2, x).real
    定义 i(x):
        返回 f(a1, a2, x).imag
    y = quad(r, 1, 2)[0] + quad(i, 1, 2)[0] * 1j
    返回 y

定义函数(Z):
    a1 = Z[0] + Z[1] * 1j
    a2 = Z[2] + Z[3] * 1j
    y1 = g(a1, a2, f1) - 1
    y2 = g(a1, a2, f2) - 1/3
    返回 np.array([y1.real, y1.imag, y2.real, y2.imag])

X0 = np.array([2.0, -2.0, -0.1, 1.0])
打印(根(函数,X0,tol=1e-12))

输出:

fjac: 数组([[-0.30890916, 0.05007557, 0.09254457, 0.94525291],
       [-0.12460792,-0.41710616,-0.89760745,0.06925448],
       [0.41309815,-0.83196711,0.34050112,0.14573825],
       [0.84758358,0.36241635,-0.26418811,0.28365668]])
     有趣:数组([-2.88657986e-15,-2.49800181e-15,-1.89293026e-14,
        -2.43138842e-14])
 消息:“解决方案收敛。”
    nfev:24
     qtf: 数组([ -9.32740208e-12, 6.42466839e-12, -3.53520661e-12,
        -1.78427395e-12])
       r:数组([-3.43272029,0.72043771,-14.00467579,-11.98268077,
        -2.65005807、13.29034808、-12.53526771、-7.04373163、
         2.58188876, -7.03891799])
  状态:1
 成功:真
       x:数组([2.08361998,-2.16305211,-0.14431126,1.20659059])

请注意,我已将第二个函数的定义更改为使用x术语而不是x^2术语,以便它与您的解决方案匹配:) 我猜这是您问题中的错字。